代码之家  ›  专栏  ›  技术社区  ›  Kirill Vasilkovich

Nest.js+TypeORM.TypeORM没有看到.env文件

  •  0
  • Kirill Vasilkovich  · 技术社区  · 2 年前

    我对类型迁移有一些问题。我有typeorm配置(见下文)。

    data-source.ts :

    import { DataSource, DataSourceOptions } from 'typeorm';
    
    export const dataSourceOptions: DataSourceOptions = {
      type: 'postgres',
      host: process.env.POSTGRES_HOST,
      port: +process.env.POSTGRES_PORT,
      username: process.env.POSTGRES_USERNAME,
      password: process.env.POSTGRES_PASSWORD,
      database: process.env.POSTGRES_DATABASE,
      entities: ['dist/**/*.entity.js'],
      migrations: ['dist/db/migrations/*.js'],
      synchronize: true,
    };
    
    const dataSource = new DataSource(dataSourceOptions);
    export default dataSource;
    

    当我试图开始迁移时,typeorm会抛出一个错误(但如果我用普通字符串替换process.env,它就可以工作了)。

    我附加了package.json中的脚本

    "build": "nest build",
    "start": "cross-env NODE_ENV=production nest start",
    "start:dev": "cross-env NODE_ENV=development nest start --watch",
    "typeorm": "npm run build && npx typeorm -d dist/db/data-source.js",
    "migration:generate": "npm run typeorm -- migration:generate",
    "migration:run": "npm run typeorm -- migration:run",
    "migration:down": "npm run typeorm -- migration:revert"
    

    我需要配置来查看迁移过程中来自env的数据。

    也许这是因为我使用了cross-env。我是这样读的

    App.module.ts :

    @Module({
      imports: [
    ...
        ConfigModule.forRoot({
          envFilePath: `.${process.env.NODE_ENV}.env`,
        }),
      ],
    ...
      controllers: [],
      providers: [],
    })
    export class AppModule {}
    

    不管怎样,我希望你的帮助

    1 回复  |  直到 2 年前
        1
  •  7
  •   Micael Levi    2 年前

    在运行typeorm迁移时,nestjs不起作用。这只是打字。当您使用TypeORM CLI(命令 npx typeorm ... ),并且TypeORM不知道它正在与NestJS一起使用。

    所以你有代码的地方 ConfigModule.forRoot 未调用。这就是为什么你的.env没有阅读

    解决此问题的一种方法是使用 dotenv (大意是 @nestjs/config 使用under-the-hood将.env文件读取到 process.env 对象)。遵循他们的文档: https://npmjs.com/dotenv

        2
  •  3
  •   anand    2 年前

    要处理命令行迁移,您可以使用 typeorm.config.ts 根目录上的文件。

    import { DataSource, DataSourceOptions } from 'typeorm';
    import { config } from 'dotenv';
    import { resolve } from 'path';
    
    config({ path: resolve(__dirname, '.env') });
    
    const DataSourceConfig = new DataSource({
      type: 'mysql',
      host: process.env.TYPEORM_HOST,
      port: Number(process.env.TYPEORM_PORT),
      username: process.env.TYPEORM_USERNAME,
      password: process.env.TYPEORM_PASSWORD,
      database: process.env.TYPEORM_DATABASE,
      migrations: ['./database/migrations/*'],
      synchronize: false,
      extra: {
        charset: 'utf8mb4',
      },
      migrationsTableName: 'migrations',
    });
    
    export default DataSourceConfig;
    
    
    

    要在NestJS应用程序中使用typeorm,请创建 typeorm.service.js 文件

    import { Injectable } from '@nestjs/common';
    import { ConfigService } from '@nestjs/config';
    import { TypeOrmModuleOptions, TypeOrmOptionsFactory } from '@nestjs/typeorm';
    
    @Injectable()
    export class TypeOrmConfigService implements TypeOrmOptionsFactory {
      constructor(private configService: ConfigService) {}
    
      public createTypeOrmOptions(): TypeOrmModuleOptions {
        return {
          type: 'mysql',
          host: this.configService.get<string>('TYPEORM_HOST'),
          port: this.configService.get<number>('TYPEORM_PORT'),
          username: this.configService.get<string>('TYPEORM_USERNAME'),
          password: this.configService.get<string>('TYPEORM_PASSWORD'),
          database: this.configService.get<string>('TYPEORM_DATABASE'),
          autoLoadEntities: true,
        };
      }
    }
    
    

    并加载此服务 app.module.ts 文件

    @Module({
      imports: [
        ConfigModule.forRoot({ isGlobal: true }),
        TypeOrmModule.forRootAsync({ useClass: TypeOrmConfigService }),
      ]
    });
    export class AppModule {}
    

    然后在里面 package.json 文件,定义命令。请注意,我正在使用 typeorm-ts-node-commonjs 因为我的 typeorm.config.js 文件在Typescript中。

    "migration:run": "typeorm-ts-node-commonjs -d typeorm.config.ts migration:run",
    "migration:create": "cd database/migrations && typeorm-ts-node-commonjs migration:create",
    "migration:revert": "typeorm-ts-node-commonjs -d typeorm.config.ts migration:revert"