我可以在 Node.js/Express 中动态导入 TypeScript 模块吗?

Posted

技术标签:

【中文标题】我可以在 Node.js/Express 中动态导入 TypeScript 模块吗?【英文标题】:Can I dynamically import TypeScript modules in Node.js/Express? 【发布时间】:2017-08-20 17:42:16 【问题描述】:

我有一个使用 Express.js 构建并使用 TypeScript 编码的 Node.js 服务器。这是我的服务器的 get 调用的 sn-p:

server.ts

private get(req: Request, res: Response, next: NextFunction, objectName: string) 
    var DatabaseObject = require("./models/" + objectName + ".js")(this.orm, Sequelize.DataTypes);
    var Transform = require("./routes/" + objectName + ".js");
    var transform = new Transform();

    // ...

    console.log(req.query["columns"]);
    console.log(transform.columnWhitelist);
    console.log(transform);

    // ...

    if (transform.columnWhitelist) 
        console.log("Column Whitelist Exists.");
    
    // ...

它为 URL 中请求的数据库对象动态加载 Sequelize 模块,然后尝试加载 TypeScript 模块,其中包含可以选择哪些列、可以查询哪些列等的规则。这是我的规则集的开头类:

account.ts

export default class Transform 
    static columnWhitelist : Object = "id": "id", "name": "name", "parentAccountId":"parentAccountId", "masterAccountId":"masterAccountId";

    constructor()  

但是,运行我的应用程序,我得到:

id,name,parentAccountId
undefined
 default: 
    [Function: Transform]
     columnWhitelist: 
       id: 'id',
        name: 'name',
        parentAccountId: 'parentAccountId',
        masterAccountId: 'masterAccountId'   

在调用 transform.columnWhitelist 时,我得到了未定义,尽管在生成的 javascript 文件中也看到了它。我也试过了:

    var transform = require("./routes/" + objectName + ".js");

或者:

    var transform = require("./routes/" + objectName + ".js")();

但这些都不起作用。

【问题讨论】:

【参考方案1】:

如果你不想使用

var transform = require("./routes/" + objectName + ".js").default;

您可以通过以下方式导出您的课程

class Transform 
     static columnWhitelist: Object = "id": "id", "name": "name", "parentAccountId": "parentAccountId", "masterAccountId": "masterAccountId";

     constructor () 


export = Transform;

之后你可以像以前一样再做一次:

var transform = require ("./ routes /" + objectName + ".js");

【讨论】:

export = Transform; 是 TypeScript 特有的语法还是 JavaScript 的 module.exports = ...,还是后者的另一种写法? export = 用于为 typescript 提供 export default 行为。此外,它还适用于接口、函数、枚举等...您可以通过阅读文档https://www.typescriptlang.org/docs/handbook/modules.html 了解更多信息(您可以使用 export = 进行搜索)如果您想继续输入,可以添加:var transform: typeof Transform = require("./routes/" +objectName+ ".js");【参考方案2】:

如果您在 tsconfig.json 中有 commonjs 作为模块,并且默认导出 Transform 类,您可能应该将其导入为

 var transform = require("./routes/" + objectName + ".js").default;

【讨论】:

我现在明白了。非常感谢!有一次我确实尝试过var Transform = require("./routes/" + objectName + ".js"); var transform = Transform.Transform; 或类似的东西,但我一定是打错了。

以上是关于我可以在 Node.js/Express 中动态导入 TypeScript 模块吗?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js:Express 框架

Node.js Express 框架

Node.js Express 框架

如何在 Node.js / Express.js 中将中间件放在它自己的文件中

如何使用 Express / Node.JS 创建可在所有视图中访问的全局变量?

Node.js Express开发框架