问题描述
我正在处理一个节点项目,并且我是第一次使用 typeORM,所以我知道这可能是用户错误。我的理想设置是:
- 通过 ts-node 使用 typeorm cli 基于 *.ts 实体生成 *.ts 迁移。
- 将打字稿编译为 javascript。
- 使用 typeorm cli 根据 javascript 输出应用和恢复迁移。
尝试设置它非常混乱,我最终遇到了一些情况,即使用 ts-node 通过 cli 生成迁移会在我想要的地方创建 *.ts 迁移 - 但它正在确定基于以下内容的架构差异javascript 迁移目录,而不是打字稿目录。这仍然是我的偏好,即使它需要额外的脚本和其他配置。
由于上述内容不起作用,我正在尝试通过 ts-node(生成、迁移、还原等)使所有 typeorm cli 内容正常工作。我有为此,请遵循 ormconfig:
{
"type": "postgres","host": "localhost","port": 5432,"username": process.env.DATABASE_USER,"password": process.env.DATABASE_PASSWORD,"database": process.env.DATABASE_NAME,"logging": false,"entities": [
"src/database/models/**/*.ts"
],"migrations": [
"src/database/migrations/**/*.ts"
],"subscribers": [
"src/database/subscribers/**/*.ts"
],"cli": {
"entitiesDir": "src/database/models/","migrationsDir": "src/database/migrations","subscribersDir": "src/database/subscribers"
}
}
我有以下脚本:
"scripts": {
"typeorm": "ts-node --require ts-node/register ./node_modules/typeorm/cli.js --config ormconfig.js","typeorm:revert": "npm run typeorm migration:revert","typeorm:generate": "npm run typeorm migration:generate -- -n","typeorm:create": "npm run typeorm migration:create","typeorm:migrate": "npm run typeorm migration:run"
}
每当我运行 npm run typeorm:generate
时,我都会收到以下错误:
src/database/models/MyModel.ts:4:55 - error TS2339: Property 'decorate' does not exist on type 'typeof Reflect'.
4 if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators,target,key,desc);
~~~~~~~~
src/database/models/MyModel.ts:4:92 - error TS2339: Property 'decorate' does not exist on type 'typeof Reflect'.
4 if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators,desc);
~~~~~~~~
src/database/models/MyModel.ts:9:55 - error TS2339: Property 'Metadata' does not exist on type 'typeof Reflect'.
9 if (typeof Reflect === "object" && typeof Reflect.Metadata === "function") return Reflect.Metadata(k,v);
~~~~~~~~
src/database/models/MyModel.ts:9:95 - error TS2339: Property 'Metadata' does not exist on type 'typeof Reflect'.
9 if (typeof Reflect === "object" && typeof Reflect.Metadata === "function") return Reflect.Metadata(k,v);
reflect-Metadata
已安装并导入到我的应用程序的入口点中,并且在运行 tsc 时可以正常编译。我真的很难根据 TypeORM 文档找出配置所有这些的最佳方法,为什么它不起作用,我需要做什么来修复它?如果有人能指出我正确的方向并澄清我的困惑,我将不胜感激。看起来这应该是非常简单和直接的事情,开箱即用,麻烦最少,但我已经阅读了文档并且无法弄清楚。
我的tsconfig如下:
{
"compilerOptions": {
"module": "Commonjs","target": "ES2018","outDir": "dist","lib": [
"ES6","ESNext","ESNext.Array","ESNext.AsyncIterable","ESNext.Intl","ESNext.Symbol","DOM"
],"sourceMap": false,"inlinesourceMap": true,"inlinesources": true,"incremental": true,"esModuleInterop": true,"experimentalDecorators": true,"emitDecoratorMetadata": true,"paths": {
"my-module": ["./src/typings"]
}
},"include": [
"./src/**/*"
],"exclude": [
"node_modules"
]
}
解决方法
我按照 typeorm 安装/设置指南启动了一个新项目,并使用默认生成的项目进行了所有操作。然后我慢慢开始复制实体和其他与数据库相关的东西,并在它们进来时添加依赖项,并不断检查以确保每次编译项目。然后我确保我仍然可以在没有构建版本的情况下运行所有 typeorm 迁移命令。
当我这样做并让它发挥作用时 - 它奏效了。
然后我比较了项目之间的差异,问题就在我原来的帖子中。 typeorm
脚本应该是:
"typeorm": "node --require ts-node/register ./node_modules/typeorm/cli.js --config ormconfig.json",
不是我最初拥有的 - 但是,当我现在将其更改回原始帖子中的内容时,我无法重现错误。所以我真的不确定原因是什么。在整个过程中,我没有做任何其他改变。