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,这样您就可以在不更改src
和dist
之间的代码的情况下查看两者。
注意:join
来自 path
模块
【讨论】:
天啊,我其实也偶然发现了这个。能够让它与'/dist/**/entities/*.entity.js'
一起工作。虽然无法将dist,src/**/entities/*.entity.js,ts
与 seqeulize-typescript 一起使用(给了我同样的错误)
可能仍在尝试使用 src 目录,它绝对不应该这样做。哦,是的,我通常使用__dirname
和path
模块中的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 配置时,无法解析模型模块