【问题标题】:How to set up Angular-like configuration environment files in NestJS?如何在 NestJS 中设置类似 Angular 的配置环境文件?
【发布时间】:2020-10-31 21:09:45
【问题描述】:

NestJS 是否允许以与 Angular 类似的方式拥有环境文件?

在 Angular 中,您有单独的环境文件,这些文件会根据应用程序环境(开发、生产...)自动映射:

  • src/environments/environment.ts
  • src/environments/environment.prod.ts

@nestjs/config 是否提供了类似的优雅简单的方法来分离和管理环境变量?不幸的是,我在官方文档中找不到关于 NestJS 的这种模式的详细解释或可用示例:https://docs.nestjs.com/techniques/configuration

【问题讨论】:

    标签: typescript environment-variables config nestjs nestjs-config


    【解决方案1】:

    不熟悉 Angular,所以我不知道它是否直观,但您应该考虑使用 Dynamic Modules 来注入您的配置。

    NestJS 文档中的示例已经非常接近您想要的,除了它们适用于直接在 ConfigService 中加载的不同 .env 文件。

    您的案例需要一些编码,但您只需执行一次,然后可以在任何其他 NestJS 项目中重复使用。查看文档,您可以派生由ConfigModule.register() 服务的Injectable() 提供程序,它基于process.env.NODE_ENV 是适当环境类的一个实例。

    或者您当然可以使用直接加载.env 的开箱即用示例。但这不是强类型的。


    我个人使用基于 Joi 的 Schema ValidationConfiguration Namespaces 并且还为配置设置定义了一个接口。像下面的示例代码:

    env.schema.ts:

    export const envSchema = Joi.object({
    
      NODE_ENV: Joi.string()
        .valid('development', 'production')
        .default('development'),
    
      EMAIL_VERIFICATION_SECRET: Joi.string().when('NODE_ENV', {
        is: 'production',
        then: Joi.required(),
        otherwise: Joi.optional().default('the_email_verification_secret'),
      }),
    });
    

    email.config.ts:

    interface EmailConfig {
      verificationSecret: string;
    }
    
    export default registerAs('email', (): EmailConfig => ({
      verificationSecret: process.env.EMAIL_VERIFICATION_SECRET,
    }));
    

    notification.module.ts:

    @Module({
      imports: [
        ConfigModule.forFeature(emailConfig),
      ],
    })
    export class NotificationModule {}
    

    email-notification.service.ts:

    @Injectable()
    export class EmailNotificationService {
      private secret: string;
    
      constructor(
        @Inject(emailConfig.KEY)
        private mailConfig: ConfigType<typeof emailConfig>,
      ) {
        this.secret = this.mailConfig.verificationSecret;
      }
    }
    

    当然,您不必使用配置命名空间,但它会将配置分解为您在特定模块中所需的块。通过接口进行强类型化,并且使用Joi,您的架构既可以验证也可以适应适当的环境。

    【讨论】:

      猜你喜欢
      • 2019-10-17
      • 2018-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-09
      • 2012-09-17
      • 2018-10-27
      • 2020-09-22
      相关资源
      最近更新 更多