为打字稿配置 TypeORM 忽略反射元数据

问题描述

我正在处理一个节点项目,并且我是第一次使用 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",

不是我最初拥有的 - 但是,当我现在将其更改回原始帖子中的内容时,我无法重现错误。所以我真的不确定原因是什么。在整个过程中,我没有做任何其他改变。