【问题标题】:How to manage different config environments in nestjs如何在nestjs中管理不同的配置环境
【发布时间】:2020-08-09 09:39:31
【问题描述】:

我想要一些环境,比如说developmentproductiontest。这些环境应该是独立的并使用它们自己的一组配置参数,例如用于 DB、SERVER_PORT、USER 等。 它们不应该在代码库中,所以我认为它们应该是不同的 .env 文件。也就是说,我应该能够根据处于活动状态的环境加载不同的 .env 文件。此外,还不清楚我必须在哪里设置该环境切换器。

也许它应该是具有 NODE_ENV 参数的单个 .env 文件,该参数可以设置为上述任何值,无论是开发、生产还是测试。并且根据此参数的值,自动加载一组必要的配置参数。

我已阅读文档,目前对我来说似乎有点困惑。

似乎应该有一些配置工厂。

【问题讨论】:

    标签: nestjs


    【解决方案1】:

    这个用例有两种方法。

    1.创建.prod.env.development.env.test.env 并像这样加载所需的环境。

    ConfigModule.forRoot({envFilePath: '.development.env'});
    

    2.从函数创建配置

    export default () => ({
      port: parseInt(process.env.PORT, 10) || 3000,
      database: {
        host: process.env.DATABASE_HOST,
        port: parseInt(process.env.DATABASE_PORT, 10) || 5432
      }
    });
    

    并使用

    @Module({
      imports: [
        ConfigModule.forRoot({
          load: [configuration],
        }),
      ],
    })
    

    查看更多here

    【讨论】:

      【解决方案2】:

      您可以使用official documentation 中提到的配置库。 否则你可以使用 npm 库dotenv

      无论哪种方式,真正重要的是您如何组织 .env 文件。 Env 文件应该包含数据库凭据、加密密钥和许多机密数据,因此将它们置于版本控制中并不是一个好主意。相反,您应该将 .env 文件存储在系统中。生产服务器将具有带有生产机密的 .env 文件,开发人员服务器可以具有带有本地机密的 .env 文件。标记 .env 被 git 忽略。这样您就不必根据环境进行更改,它会根据您正在部署的服务器自动进行正确的配置。

      【讨论】:

      • 仅供参考:根据文档,nest-js 在后台使用 dotenv
      【解决方案3】:

      假设您在项目的根目录中有以下配置文件:env.developmentenv.stagingenv.test

      这是我将如何实现它:

      app.module.ts 文件中:

      import { ConfigModule } from '@nestjs/config';
      
      const ENV = process.env.NODE_ENV;
      
      @Module({
        imports: [
          ConfigModule.forRoot({
            envFilePath: !ENV ? '.env' : `.env.${ENV}`,
          }),
        ],
        controllers: [AppController],
      })
      export class AppModule {}
      

      受此解决方案启发:https://github.com/nestjsx/nestjs-config#using-different-env-files

      【讨论】:

      • 我更喜欢这种方法。但是你在哪里设置process.env.NODE_ENV。在 Package.json 中?
      • @KrishnanSriram "start:dev": "NODE_ENV=development nest start --watch" 是一种方法。
      • @ChristianGroleau 使用 cross-env 将确保为所有操作系统(windows、linux)设置 env 变量。
      • console.log('ENV', ENV); = ENV 未定义
      【解决方案4】:

      诀窍是为基于环境变量 NODE_ENV 的 Netjs ConfigModule 的 envFilePath 配置定义自定义文件名路径。然后,您可以在 package.json 中的不同脚本中设置 NODE_ENV 的值

      在你的 app.module.ts 中添加

      // Grab the system env variable
      const ENV = process.env.NODE_ENV;
      
      // Set custom filepath in ConfigModule properties based on NODE_ENV
      @Module({
        imports: [
          ConfigModule.forRoot({
          envFilePath: !ENV ? '.env.dev' : `.env.${ENV}`
          })
        ]
      })
      

      在您的 package.json 文件中修改您的“脚本”以设置 NODE_ENV

      "scripts": {
        "start:dev": "NODE_ENV=dev nest start --watch",
        "start:prod": "NODE_ENV=prod node dist/main"
      }
      

      【讨论】:

        【解决方案5】:

        如果你想深入使用 @nestjs/config ,试试这样

        mkdir 一个名为config的字典,结构

        - /config
          - config.default.ts
          - config.dev.ts
          - config.production.ts
          - configuration.ts
        

        像这样在config.ENV.ts 中设置个人配置

        export default {
          // nodemailer config
          mailer: {
            host: 'xxx',
            port: 80,
            auth: {
              user: 'xxx',
              pass: 'xxx',
            },
            secure: false, // or true using 443
          },
          // jwt sign secret
          jwt: {
            secret: process.env.JWT_SECRET || '123456',
          }
        }
        
        

        然后将这些文件动态导出到configuration.ts

        import { merge } from 'lodash';
        import DefaultConfig from './config.default';
        
        
        
        export default () => {
          let envConfig = {};
          try {
            // eslint-disable-next-line @typescript-eslint/no-var-requires
            envConfig = require(`./config.${process.env.NODE_ENV}`).default;
          } catch (e) {
        
          }
          
          return merge(DefaultConfig, envConfig);
        };
        

        app.module.ts 中导入configuration.ts

        
        import configuration from './config/Configuration';
        
        @Module({
          imports: [
            ConfigModule.forRoot({
              load: [configuration],
            }),
          ],
        })
        

        就是这样

        【讨论】:

          猜你喜欢
          • 2018-11-09
          • 2013-07-25
          • 2018-10-26
          • 1970-01-01
          • 2023-04-10
          • 1970-01-01
          • 2020-10-31
          • 2021-03-13
          • 2012-11-25
          相关资源
          最近更新 更多