【问题标题】:custom config module validation with joi使用 joi 进行自定义配置模块验证
【发布时间】:2020-04-24 23:46:11
【问题描述】:

所以我遵循了如何为我的 Nest 应用程序创建配置的指南

https://docs.nestjs.com/techniques/configuration

由于我有许多配置部分,我想将这些部分拆分为多个配置服务。所以我的 app.module.ts 导入了一个自定义配置模块

@Module({
  imports: [CustomConfigModule]
})
export class AppModule {}

此自定义配置模块 (config.module.ts) 捆绑所有配置服务并加载 Nest 配置模块

@Module({
  imports: [ConfigModule.forRoot()],
  providers: [ServerConfigService],
  exports: [ServerConfigService],
})
export class CustomConfigModule {}

最后,我有一个简单的配置服务 server.config.service.ts,它返回应用程序正在运行的端口

@Injectable()
export class ServerConfigService {
  constructor(private readonly configService: ConfigService) {}

  public get port(): number {
    return this.configService.get<number>('SERVER_PORT');
  }
}

我想在应用程序启动时验证这些服务。文档解释了如何为配置模块设置验证模式

https://docs.nestjs.com/techniques/configuration#schema-validation

在使用自定义配置模块时,如何将其用于我的服务验证? 我是否必须在每个服务构造函数中调用 joi 并验证那里的属性?

提前致谢

【问题讨论】:

    标签: nestjs joi


    【解决方案1】:

    我相信您的ConfigModule.forRoot(),您可以设置验证架构并告诉 Nest 在启动时运行验证,而不必将其添加到每个自定义配置服务中。文档显示如下:

    @Module({
      imports: [
        ConfigModule.forRoot({
          validationSchema: Joi.object({
            NODE_ENV: Joi.string()
              .valid('development', 'production', 'test', 'provision')
              .default('development'),
            PORT: Joi.number().default(3000),
          }),
          validationOptions: {
            allowUnknown: false,
            abortEarly: true,
          },
        }),
      ],
    })
    export class AppModule {}
    

    这将在 NODE_ENVPORT 上运行验证。您当然可以将其扩展到更多的验证。然后,您可以只拥有一个 ConfigModule,它具有较小的配置服务,将每个段分开,因此所有验证都在启动时运行,并且每个模块的上下文中只有您需要的内容可用。

    【讨论】:

    • 您好,非常感谢您的回复。我正在寻找一种方法来在 server.config.service.ts 中进行我的 joi 验证,并在 database.config.service.ts 中进行另一个 joi 验证。你会怎么做?只是在每个服务的构造函数中调用它?我认为这将是一种更简洁的方法,因为每个配置都可以自我验证,并且自定义配置模块不必知道所有那些到处飞来飞去的字段...
    • 如果您想要单独的验证,您需要为每个验证使用 Joi 模式,并且您需要在每个服务的构造函数(或从构造函数调用的方法)中运行验证。老实说,由于验证可能非常繁重,我想说的是在启动时将其排除在同一个地方,因为它将所有东西放在一起是更可取的。不过,那是我的两分钱
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 2020-08-04
    • 1970-01-01
    • 2015-10-02
    • 2015-06-07
    • 2020-03-01
    • 1970-01-01
    相关资源
    最近更新 更多