迁移文件中的 NestJS TypeORM 语法错误

Posted

技术标签:

【中文标题】迁移文件中的 NestJS TypeORM 语法错误【英文标题】:NestJS TypeORM syntax error in migration file 【发布时间】:2020-08-26 03:06:13 【问题描述】:

我正在浏览 NestJS 官方文档。我在 Heroku 上设置了 PostgreSQL,与 TypeORM 连接,运行迁移,然后我的应用程序开始崩溃。我尝试了不同的方法并在 github/questions 上搜索了博客/问题,但没有任何帮助。

这是一个错误:

[Nest] 46723   - 05/10/2020, 6:33:42 PM   [InstanceLoader] TypeOrmModule dependencies initialized +84ms
[Nest] 46723   - 05/10/2020, 6:33:43 PM   [TypeOrmModule] Unable to connect to the database. Retrying (1)... +493ms
/Users/Shared/diploma/be/migration/1589119433066-AddUser.ts:1
import MigrationInterface, QueryRunner from "typeorm";
       ^

SyntaxError: Unexpected token 
    at Module._compile (internal/modules/cjs/loader.js:721:23)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:787:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)
    at Module.require (internal/modules/cjs/loader.js:690:17)
    at require (internal/modules/cjs/helpers.js:25:18)
    at Function.PlatformTools.load (/***/PROJECT_ROOT/node_modules/typeorm/platform/PlatformTools.js:114:28)
    at /***/PROJECT_ROOT/node_modules/typeorm/util/DirectoryExportedClassesLoader.js:39:69
    at Array.map (<anonymous>)

这是我的ormconfig.json

  "type": "postgres",
  "url": "postgres://***",
  "ssl": true,
  "extra": 
    "ssl": 
      "rejectUnauthorized": false
    
  ,
  "entities": ["dist/**/*.entity.ts,.js"],
  "migrationsTableName": "custom_migration_table",
  "migrations": ["migration/*.ts,.js"],
  "cli": 
    "migrationsDir": "migration"
  

迁移是使用ts-node ./node_modules/.bin/typeorm migration:generate -n AddUser 生成的 我正在使用nest start --watch 命令来启动应用程序。

迁移文件TIMESTAMP-AddUser.ts:

import MigrationInterface, QueryRunner from "typeorm";

export class AddUser1589119433066 implements MigrationInterface 
    name = 'AddUser1589119433066'

    public async up(queryRunner: QueryRunner): Promise<void> 
        await queryRunner.query(`CREATE TABLE "users" (...)`, undefined);
    

    public async down(queryRunner: QueryRunner): Promise<void> 
        await queryRunner.query(`DROP TABLE "users"`, undefined);
    


【问题讨论】:

您是否尝试过从迁移中删除 javascript 文件(反之亦然)?听起来它正在尝试作为 JS 而不是 TS 执行,你能显示你的迁移文件或至少它的最小版本吗? @Isolated 我将迁移文件添加到主消息中。 TypeORM 生成 .ts 迁移,应该没问题(根据他们的文档)。我用 ts-node 运行它(也在 typeorm 文档中指定),它应用到数据库没有问题 我不在 PC 上,所以这只是基本调试,我最后的想法是在 CLI 中将 entitiesDir: 设置为您的 TS 实体,我很快就会在我的 PC 上,所以我会看看我是否可以在我的 nest.js 中重现它 【参考方案1】:

感谢@Isolated! 我已经更改了ormconfig.json,所以实体和迁移文件现在看起来像这样,它对我来说很好用:

"entities": ["dist/**/*.entity.ts,.js"],
"migrations": ["dist/migration/*.ts,.js"],

【讨论】:

以上是关于迁移文件中的 NestJS TypeORM 语法错误的主要内容,如果未能解决你的问题,请参考以下文章

播种时NestJS中的TypeOrm:RepositoryNotFoundError

使用 NestJS 和 TypeORM 为项目生成迁移文件

NestJS、PortsgreSQL 和 TypeORM - 迁移运行不正常

使用 TypeORM 和 NestJs 和 Typescript 创建新迁移时出错 [关闭]

如何在 Nestjs 中使用 .env 文件设置 Typeorm 的配置

Azure 静态 Web 应用 API 中的 TypeORM 迁移