不同的环境在Nestjs中不起作用

发布于 2025-01-24 12:14:17 字数 1559 浏览 4 评论 0原文

我想创建一个新的环境来测试我的应用程序。我有一个.env文件和.env.test文件。

这是我的app.module.ts file:

@Module({
  imports: [
    ConfigModule.forRoot({
      envFilePath: !process.env.NODE_ENV
        ? '.env'
        : `.env.${process.env.NODE_ENV}`,
    }),
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: process.env.POSTGRES_HOST,
      port: parseInt(<string>process.env.POSTGRES_PORT),
      username: process.env.POSTGRES_USER,
      password: process.env.POSTGRES_PASSWORD,
      database: process.env.POSTGRES_DATABASE,
      autoLoadEntities: true,
      entities: [User],
      synchronize: true,
    }),
    AuthModule,
  ],
  controllers: [],
  providers: [],
})
export class AppModule {}

问题是.env.test从未调用,.env始终运行,即使process.env.node_env返回test。 这就是我设置我的package.json文件的方式:

 "start:test": "NODE_ENV=test nest start --watch",

这就是我的.env.test文件的方式,就像

POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_USER=postgres
POSTGRES_PASSWORD=Random
POSTGRES_DATABASE=db-test

我也尝试使用硬码envfilepath:'。 env.test',,它仍然不起作用。对于.env.test要工作的文件,我必须重命名.env文件,然后效果很好。

更新!

它现在有效。我所做的是放入

ConfigModule.forRoot({
      envFilePath: !process.env.NODE_ENV
        ? '.env'
        : `.env.${process.env.NODE_ENV}`,
    }),

应用程序中的每个模块中。

I would like to create a new environment for testing my app. I have a .env file and .env.test file.

This is my app.module.ts file:

@Module({
  imports: [
    ConfigModule.forRoot({
      envFilePath: !process.env.NODE_ENV
        ? '.env'
        : `.env.${process.env.NODE_ENV}`,
    }),
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: process.env.POSTGRES_HOST,
      port: parseInt(<string>process.env.POSTGRES_PORT),
      username: process.env.POSTGRES_USER,
      password: process.env.POSTGRES_PASSWORD,
      database: process.env.POSTGRES_DATABASE,
      autoLoadEntities: true,
      entities: [User],
      synchronize: true,
    }),
    AuthModule,
  ],
  controllers: [],
  providers: [],
})
export class AppModule {}

The problem here is that .env.test is never called, .env always runs even though process.env.NODE_ENV returns test.
And this is how i set up my package.json file:

 "start:test": "NODE_ENV=test nest start --watch",

This is how my .env.test file looks like

POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_USER=postgres
POSTGRES_PASSWORD=Random
POSTGRES_DATABASE=db-test

I also tried to hardcode envFilePath: '.env.test', and it still not working. For .env.test file to work i have to rename .env file and then it works fine.

UPDATE!

It works now. What i did was i put

ConfigModule.forRoot({
      envFilePath: !process.env.NODE_ENV
        ? '.env'
        : `.env.${process.env.NODE_ENV}`,
    }),

in every module i have in my app.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

╭ゆ眷念 2025-01-31 12:14:17

当您使用configModule时,大概是从@nestjs/config使用typeormmodule's forRootAsyAsync 确保您使用read .env文件的方法。

@Module({
  imports: [
    ConfigModule.forRoot({
      envFilePath: !process.env.NODE_ENV
        ? '.env'
        : `.env.${process.env.NODE_ENV}`,
    }),
    TypeOrmModule.forRootAsync({
      inject: [ConfigService],
      useFactory: (config: ConfigService): PostgresConnectionOptions => ({
        type: 'postgres' as const,
        host: config.get('POSTGRES_HOST'),
        port: parseInt(config.get('POSTGRES_PORT')),
        username: config.get('POSTGRES_USER'),
        password: config.get('POSTGRES_PASSWORD'),
        database: config.get('POSTGRES_DATABASE'),
        autoLoadEntities: true,
        entities: [User],
        synchronize: true,
      }),
    }),
    AuthModule,
  ],
  controllers: [],
  providers: [],
})
export class AppModule {}

As you're using the ConfigModule presumably from @nestjs/config you should be using the TypeormModule's forRootAsync method to make sure you use the read .env file.

@Module({
  imports: [
    ConfigModule.forRoot({
      envFilePath: !process.env.NODE_ENV
        ? '.env'
        : `.env.${process.env.NODE_ENV}`,
    }),
    TypeOrmModule.forRootAsync({
      inject: [ConfigService],
      useFactory: (config: ConfigService): PostgresConnectionOptions => ({
        type: 'postgres' as const,
        host: config.get('POSTGRES_HOST'),
        port: parseInt(config.get('POSTGRES_PORT')),
        username: config.get('POSTGRES_USER'),
        password: config.get('POSTGRES_PASSWORD'),
        database: config.get('POSTGRES_DATABASE'),
        autoLoadEntities: true,
        entities: [User],
        synchronize: true,
      }),
    }),
    AuthModule,
  ],
  controllers: [],
  providers: [],
})
export class AppModule {}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文