3

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

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

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

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

4

1 回答 1

0

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

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

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

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


我个人使用基于 Joi 的模式验证配置命名空间,并为配置设置定义一个接口。像下面的示例代码:

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'),
  }),
});

电子邮件.config.ts:

interface EmailConfig {
  verificationSecret: string;
}

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

通知.module.ts:

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

电子邮件通知.service.ts:

@Injectable()
export class EmailNotificationService {
  private secret: string;

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

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

于 2020-07-14T07:58:34.303 回答