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

标签 nestjs 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,它返回应用程序正在运行的端口

@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,它具有较小的配置服务,可以将每个段分开,以便所有验证都在启动时运行,并且每个模块的上下文中只有您需要的内容可用。

关于nestjs - 使用 joi 进行自定义配置模块验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59628934/

相关文章:

header - Fastify & NestJS - 如何在拦截器中设置响应头

graphql - NestJS GraphQL 联合循环解析器

node.js - 如何在hapi.js中实现Joi验证?

node.js - 对于任何字符串类型错误显示相同的自定义错误消息 [ EXPRESS + JOI ]

typescript - NestJS 使用 .env 和 @nestjs/config 设置 TypeOrm 连接

javascript - 禁用 NestJS 中所有 POST 的状态 201

javascript - NestJS 是如何匹配注入(inject)目标和注入(inject)实例的?

javascript - 如何检查 Joi 中的有效对象

node.js - joi 验证中的 .when(),根据另一个 key 验证一个 key

validation - 有没有办法合并 Joi 模式?