使用 joi 进行自定义配置模块验证

custom config module validation with joi

所以我按照有关如何为我的 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 其中 returns 应用程序 运行 在

上的端口
@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 并验证那里的属性?

提前致谢

我相信您 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,它具有较小的配置服务,将每个部分分开,因此所有验证都是 运行 在启动时,只有你需要的在每个模块的上下文中可用。