sequelize-typescript - 当使用带有 `tsc` 编译器(带有 NestJS)的 glob 配置时,无法解析模型模块

Posted

技术标签:

【中文标题】sequelize-typescript - 当使用带有 `tsc` 编译器(带有 NestJS)的 glob 配置时,无法解析模型模块【英文标题】:sequelize-typescript - When using glob configuration with `tsc` compiler (with NestJS) cannot resolve model modules 【发布时间】:2020-03-29 18:41:26 【问题描述】:

我正在设置sequelize-typescript,然后添加模型:

    import appRoot from 'app-root-path'

    connection = new Sequelize(... connection details)
    const appGlobPattern = join(appRoot.toString(), 'src/**/entities/*.entity.ts')
    // appGlobPattern = absolute path to the root of the project (i.e. C:/Users/user/my-project/)
    this.connection.addModels([appGlobPattern])

尝试在sequelize-service (https://github.com/RobinBuschmann/sequelize-typescript/blob/1c34e87c968b1c8333ef6467c2dd44e069e06fa8/src/sequelize/sequelize/sequelize-service.ts#L57) 中执行require(fullPath) 行时引发错误

由于文件解析器无法解析文件(存在)而引发错误:

错误:找不到模块“C:\Users\user\my-project\src\entities\my-model.entity”

全栈跟踪

Error: Cannot find module 'C:\Users\........\notification\entities\communication-channel.entity'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)
    at Function.Module._load (internal/modules/cjs/loader.js:562:25)
    at Module.require (internal/modules/cjs/loader.js:692:17)
    at require (internal/modules/cjs/helpers.js:25:18)
    at glob.sync.filter.map.filter.map.fullPath (C:\Users\........\notification\node_modules\sequelize-typescript\dist\sequelize\sequelize\sequelize-service.js:44:32)
    at Array.map (<anonymous>)
    at arg.reduce (C:\Users\........\notification\node_modules\sequelize-typescript\dist\sequelize\sequelize\sequelize-service.js:43:18)
    at Array.reduce (<anonymous>)
    at Object.getModels (C:\Users\........\notification\node_modules\sequelize-typescript\dist\sequelize\sequelize\sequelize-service.js:35:20)
    at Sequelize.addModels (C:\Users\........\notification\node_modules\sequelize-typescript\dist\sequelize\sequelize\sequelize.js:34:44)
    at DatabaseConnection._addModelsToConnection (C:\Users\........\notificationn\dist\database\classes\database-connection.js:33:25)
    at DatabaseConnection.createConnection (C:\Users\........\notification\dist\database\classes\database-connection.js:23:14)
    at InstanceWrapper.useFactory [as metatype] (C:\Users\........\notification\dist\database\providers\database-connection-pool.provider.js:13:30)
    at process._tickCallback (internal/process/next_tick.js:68:7)
    at Function.Module.runMain (internal/modules/cjs/loader.js:834:11)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:622:3)

这似乎与 NestJS 默认使用的 tsc 编译器有关。或者模块加载器可能不适合绝对文件路径。


更多细节:

续集:“版本”:“5.21.2” 续集打字稿:“版本”:“1.0.0” 打字稿“版本”:“3.7.2”

这些是我的 tsconfig 设置:


  "compilerOptions": 
    "module": "CommonJS",
    "moduleResolution": "node",
    "declaration": true,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "esModuleInterop": true,
    "target": "ES6",
    "sourceMap": true,
    "outDir": "./dist",
    "baseUrl": "./",
    "incremental": true,
    "paths": 
      "express": ["src/multi-tenancy/types/*"]
    
  ,
  "exclude": ["node_modules", "dist"]

【问题讨论】:

【参考方案1】:

您不应该使用 src 作为文件路径的一部分,因为一旦您将代码从 Typescript 编译为 javascript,您的代码现在位于 dist 并且 src 文件夹在上下文中丢失。您还应该将.ts 更改为.js,因为这是运行时将解析的文件。另一种选择是使用像join(__dirname, 'dist,src/**/entities/*.entity.js,ts') 这样的glob,这样您就可以在不更改srcdist 之间的代码的情况下查看两者。

注意:join 来自 path 模块

【讨论】:

天啊,我其实也偶然发现了这个。能够让它与'/dist/**/entities/*.entity.js' 一起工作。虽然无法将dist,src/**/entities/*.entity.js,ts 与 seqeulize-typescript 一起使用(给了我同样的错误) 可能仍在尝试使用 src 目录,它绝对不应该这样做。哦,是的,我通常使用__dirnamepath 模块中的join 函数。我会更新答案。

以上是关于sequelize-typescript - 当使用带有 `tsc` 编译器(带有 NestJS)的 glob 配置时,无法解析模型模块的主要内容,如果未能解决你的问题,请参考以下文章

Sequelize beforeConnect 钩子与 sequelize-typescript 未运行

sequelize/sequelize-typescript - 带有 HasMany 的 findAll 返回一个对象而不是数组

如何使用 sequelize-typescript 从源实例创建关联实例

如何使用 sequelize-typescript 从单个字段中引用多个模型?

如何使用 Sequelize-Typescript 模型定义指定 NestJs 控制器的返回类型?

sequelize-typescript - 当使用带有 `tsc` 编译器(带有 NestJS)的 glob 配置时,无法解析模型模块