проверка пользовательского конфигурационного модуля с помощью joi - PullRequest
3 голосов
/ 07 января 2020

Итак, я следовал руководству о том, как создать конфигурацию для моего приложения 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 в каждом конструкторе сервисов и проверять свойства там?

Заранее спасибо

1 Ответ

2 голосов
/ 07 января 2020

Я верю в ваше 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_ENV и PORT. Вы можете, конечно, расширить его на большее количество проверок в целом. И тогда у вас может быть просто один ConfigModule, который имеет меньшие сервисы конфигурации, которые разбивают каждый сегмент, так что все проверки запускаются при запуске, и в контексте каждого модуля доступно только то, что вам нужно.

...