如何在 NestJS 中正确设置配置?

Posted

技术标签:

【中文标题】如何在 NestJS 中正确设置配置?【英文标题】:How to set up config in NestJS properly? 【发布时间】:2020-10-31 22:23:31 【问题描述】:

我正在使用nest-modules/mailer 发送电子邮件,但在MailerModule 的配置设置过程中遇到了一些问题。

(1) 以前我在main.ts 中的配置中使用了原始的dotenv 包,例如:

dotenv.config(
  path: 'src/config/config.env',
);
    

但我无法在app.module.ts 中将配置分配给MailerModule

(2) 然后我尝试使用@nesjs/config 设置配置,app.module.ts 看起来像这样:

import config from 'src/config/config';

@Module(
  controllers: [
    //...
  ],
  providers: [
   //...
 ],
  imports: [
    HttpModule,
    ConfigModule.forRoot(
      load: [config]
    ),
    MailerModule.forRoot(
      transport: 
        ignoreTLS: true,
        secure: false, // true for 465, false for other ports
        host: process.env.EMAIL_HOST,
        port: process.env.EMAIL_PORT,
        auth: 
          user: process.env.EMAILDEV_INCOMING_USER,
          pass: process.env.EMAILDEV_INCOMING_PWD 
        ,
      ,
      defaults: 
        from: `'nest-modules' $process.env.EMAILDEV_INCOMING_`, // outgoing email ID
      ,
      template: 
     
      ,
    )
  ]
)
export class AppModule implements NestModule 
 //...

所以我无法使用configServiceprocess.env.* 来加载MailerModule 的配置。

我应该如何解决这个问题?

【问题讨论】:

【参考方案1】:

我在现阶段想出了如何正确解决这个问题:

异步加载EmailModule(以及您需要使用配置的其他内容)。

imports: [
    HttpModule,
    MailerModule.forRootAsync(
      useFactory: async () => 
        return 
          transport: 
            ignoreTLS: true,
            secure: false, // true for 465, false for other ports
            host: process.env.EMAIL_HOST,
            port: process.env.EMAIL_PORT,
            auth: 
              user: process.env.EMAILDEV_INCOMING_USER, // generated ethereal user
              pass: process.env.EMAILDEV_INCOMING_PWD // generated ethereal password
            ,
          ,
          defaults: 
            from: `'nest-modules' $process.env.EMAILDEV_INCOMING_`, // outgoing email ID
          ,
          template: 
            dir: process.cwd() + '/src/shared/static/views',
            adapter: new HandlebarsAdapter(),
            options: 
              strict: true,
            ,
          ,
        
      
    )
  ]

【讨论】:

【参考方案2】:

查看nest-modules/mailer 提供的sample 代码就足以在AppModule 中加载您的.env,直接从dotenv 使用require 导入:

require('dotenv').config(
  path: 'src/config/config.env',
);

您还可以使用 dotenv 的 typescript 导入并在您的 AppModule 定义上方的一行中调用 config(),或者更好的是,在您实例化 NestJS 应用程序之前在您的 main.ts bootstrap() 函数中调用。

【讨论】:

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

Passport 策略如何知道在 nestJS 中选择正确的 jwt 策略?

如何在 NestJs 框架中使用 postgres 和 sequelize 正确定义 DTO 对象

如何在 DTO 中定义 ObjectId 以及在 NestJS Mongoose 中获取关系数据的正确查询是啥?

如何在nestjs拦截器中检测控制器?

如何对 NestJS 中的控制器应用警卫进行单元测试?

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