使用具有自定义提供程序的typeorm为Nest.js应用读取.env

时间:2020-07-21 17:07:42

标签: node.js typescript nestjs typeorm

我是nestJS的新手,我想为现有应用程序和面临的问题设置.env

我有以下appModule的自定义提供程序,

@Module({
    providers: [
      AbcService,
      XyzService,
    ],
    imports: [
      TypeOrmModule.forRoot({
        type: 'mysql',
        host: 'xxxxxxxx',
        port: 3230,
        username: 'xyz',
        password: 'password',
        database: 'xyz-db',
        entities: [__dirname + '/entities/**/*.entity{.ts,.js}'],
        synchronize: true,
        migrationsRun: true,
        logging: true,
      }),
      TypeOrmModule.forFeature([
        Transaction,
        Payment,
      ]),
      
      KafkaModule.forRoot(serviceConfig),
    ],
    exports: [],
    controllers: [ServiceSubscriptionController],
  })
  export class TopicModule { }

我已按如下所示将其导入AppModule

  @Module({
    imports: [TopicModule],
    controllers: [AppController],
    providers: [AppService],
  })
  export class AppModule {}

我想将这些内容保留在.env中,并按照以下文档进行了尝试,

TypeOrmModule.forRootAsync({
  imports: [ConfigModule.forRoot({
    envFilePath: '.env',
  })],
  useFactory: async (configService: ConfigService) => {
    return {
        host: configService.get('HOST'),
        type: 'mysql',
        port: 3230,
        username: 'xyz',
        password: 'password',
        database: 'xyz-db',
        entities: [__dirname + '/entities/**/*.entity{.ts,.js}'],
        synchronize: true,
        migrationsRun: true,
        logging: true,
    }
  },
  inject: [ConfigService]
}),

我在.env的根路径上有HOST键-值对,如下所示,但是它从中读取未定义。

package.json中,

    "start": "nest start",
    "start:dev": "nest start --watch",

2 个答案:

答案 0 :(得分:0)

如果您将文件路径传递给ConfigModule方法,似乎Nest的fs.readFileSync(envFilePath)将运行forRoot()。如果要从根目录读取它,请从用户的主目录中删除envFilePath选项,或设置完整的文件路径。

答案 1 :(得分:0)

我已按照以下说明在main.ts中手动加载了配置。

import { config } from 'dotenv';

async function bootstrap() {
  //factory method for normal TS app
  await config();
  const app = await NestFactory.create(AppModule);

现在我可以访问它了,

configService.get('HOST') // as provided in question

或作为process.env.HOST

注意:我必须使用forRootAsync而不是forRoot来访问process.env