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

Posted

技术标签:

【中文标题】如何在 Nestjs 中使用 .env 文件设置 Typeorm 的配置【英文标题】:How to set up configuration of Type ORM with .env file in Nest.JS 【发布时间】:2020-09-22 17:48:22 【问题描述】:

我想用 .env 文件设置 TypeORM 的配置,但是当我尝试运行迁移脚本时遇到问题。

我做了什么:

1.在 package.json 中添加脚本

    "migration:generate": "node_modules/.bin/typeorm migration:generate -n",
    "migration:run": "node_modules/.bin/typeorm migration:run",
    "migration:revert": "node_modules/.bin/typeorm migration:revert",

2.在app.module*中导入TypeOrmModule*

    TypeOrmModule.forRootAsync(
        imports: [ConfigModule],
        inject: [ConfigService],
        useFactory: (configService: ConfigService) => (
          type: 'mysql',
          host: configService.get('HOST'),
          port: +configService.get<number>('PORT'),
          username: configService.get('DATABASE_USERNAME'),
          password: configService.get('DATABASE_PASSWORD'),
          database: configService.get('DATABASE'),
          entities: [__dirname + '/**/*.entity.ts,.js'],
          synchronize: true,
        )
      
    )],

3.在根文件夹中创建 .env 文件

    HOST=localhost
    PORT=5432
    DATABASE_USER=dbuser
    DATABASE_PASSWORD=dbpassword
    DATABASE=dbname

现在我正在尝试像这样运行迁移脚本:

npm run migration:generate -n AddUserTable

我收到这样的错误:

Error during migration generation:
Error: No connection options were found in any orm configuration files.

根据文档,它应该是一些 ormconfig.json,但它也应该与 .env 一起使用。请告诉我,我的情况有什么问题?

【问题讨论】:

【参考方案1】:

我遇到了同样的问题。我按照本文中的配置说明解决了这个问题,它向您展示了如何生成动态ormconfig.json 文件:

https://medium.com/@gausmann.simon/nestjs-typeorm-and-postgresql-full-example-development-and-project-setup-working-with-database-c1a2b1b11b8f

额外的设置有点烦人,但它确实有效。

如果您使用的是 typescript,请注意 - 这篇文章来自 2019 年,并且每 2020 年更新到 nestjs,您需要更改 src 路径以允许 config.service.ts 中的 srcdist文件,例如。更改为这样的内容(取决于您的文件结构):

      entities: ['**/*.entity.ts,.js'],

      migrationsTableName: 'migration',

      migrations: ['src/migration/*.ts'],

      cli: 
        migrationsDir: 'src/migration',
      ,

      entities: [__dirname + '/../**/*.entity.ts,.js'],

      migrationsTableName: 'migration',

      migrations: [__dirname + '/../migration/*.ts,.js'],

      cli: 
        migrationsDir: 'src/migration',
      ,

【讨论】:

我发现我的原始答案被版主删除是完全荒谬的,因为我第一次没有在链接中添加足够的上下文。这对于我们这些面临这个问题的人来说真的很有帮助。为什么要屏蔽它?【参考方案2】:

检查导入ConfigModule.forRoot()。应该先导入

如果在 env 文件中使用这些变量,则不能将 forRootAsync 用于 TypeOrmModule

TYPEORM_CONNECTION = postgres
TYPEORM_HOST = localhost
TYPEORM_PORT = 5432
TYPEORM_USERNAME = postgres
TYPEORM_PASSWORD = 12345
TYPEORM_DATABASE = postgres
TYPEORM_SYNCHRONIZE = false
TYPEORM_MIGRATIONS_RUN = false
TYPEORM_ENTITIES = src/modules/**/*.entity.ts
TYPEORM_MIGRATIONS = db/migrations/*.ts
TYPEORM_LOGGING = true

https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md#using-environment-variables

你也可以试试这样的脚本:

"migration:run": "ts-node --project ./tsconfig.json -r tsconfig-paths/register node_modules/typeorm/cli.js migration:run",
"migration:revert": "ts-node --project ./tsconfig.json -r tsconfig-paths/register node_modules/typeorm/cli.js migration:revert",
"migration:create": "ts-node --project ./tsconfig.json -r tsconfig-paths/register node_modules/typeorm/cli.js migration:create",
"migration:generate": "ts-node --project ./tsconfig.json -r tsconfig-paths/register node_modules/typeorm/cli.js migration:generate"

【讨论】:

【参考方案3】:

关于错误信息,您应该在根项目中添加 ormconfig.json。在这种情况下,.env 文件不相关。

【讨论】:

以上是关于如何在 Nestjs 中使用 .env 文件设置 Typeorm 的配置的主要内容,如果未能解决你的问题,请参考以下文章

NestJS .env 文件未构建

NestJS 是不是使用 NODE_ENV?建议设置吗?

如何在 NestJS 中正确设置配置?

node nestjs添加全局变量

.env 文件中的变量的 nestjs 问题

如何在模块导入/配置中设置 .env 变量