如何在 NestJS 中设置类似 Angular 的配置环境文件?

Posted

技术标签:

【中文标题】如何在 NestJS 中设置类似 Angular 的配置环境文件?【英文标题】:How to set up Angular-like configuration environment files in NestJS? 【发布时间】: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

【问题讨论】:

【参考方案1】:

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

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

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

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


我个人使用基于 Joi 的 Schema Validation 和 Configuration 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,您的架构既可以验证也可以适应适当的环境。

【讨论】:

以上是关于如何在 NestJS 中设置类似 Angular 的配置环境文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NestJS 中设置仅 HTTP cookie

如何在 NestJS 中设置参数?

如何在nestjs中设置更多“jwt”AuthGuard?

如何在@nestjs/mongoose 模式中设置枚举

我如何在 NESTJS 中设置多租户

如何在nestjs中设置morgan-body