Как настроить файлы среды конфигурации, подобные Angular, в Nest JS? - PullRequest
2 голосов
/ 11 июля 2020

Позволяет ли Nest JS иметь файлы среды так же, как Angular?

В angular у вас есть отдельные файлы среды, которые автоматически отображаются в зависимости от среды приложения (разработка, производство , ...):

  • src / environments / environment.ts
  • src / environments / environment.prod.ts

Имеет @nestjs/config предоставить аналогичный элегантный и простой метод для разделения переменных среды и управления ими? К сожалению, я не могу найти подробное объяснение или полезный пример этого шаблона для Nest JS в официальных документах: https://docs.nestjs.com/techniques/configuration

1 Ответ

0 голосов
/ 14 июля 2020

Не знаком с Angular, поэтому я не знаю, настолько ли он интуитивно понятен, но вам следует подумать об использовании Dynami c Modules для внедрения вашей конфигурации.

Примеры в документации Nest JS уже достаточно близки к тому, что вы хотите, за исключением того, что они работают с разными .env файлами, которые загружаются непосредственно в ConfigService.

Некоторое кодирование требуется для вашего случая , но вам нужно будет сделать это только один раз, а затем вы сможете повторно использовать его в любом другом проекте Nest JS. Просматривая документы, вы можете получить поставщика Injectable(), обслуживаемого ConfigModule.register(), который на основе process.env.NODE_ENV является экземпляром соответствующего класса среды.

Или вы, конечно, можете использовать -box пример, который загружает .env напрямую. Но тогда это не строго типизированный.

Лично я использую Проверка схемы и Пространства имен конфигурации на основе Joi, а также определяю интерфейс для настроек конфигурации. Как в следующем примере кода:

env.schema.ts:

export const envSchema = Joi.object({

  NODE_ENV: Joi.string()
    .valid('development', 'production')
    .default('development'),

  EMAIL_VERIFICATION_SECRET: Joi.string().when('NODE_ENV', {
    is: 'production',
    then: Joi.required(),
    otherwise: Joi.optional().default('the_email_verification_secret'),
  }),
});

email.config.ts:

interface EmailConfig {
  verificationSecret: string;
}

export default registerAs('email', (): EmailConfig => ({
  verificationSecret: process.env.EMAIL_VERIFICATION_SECRET,
}));

notification.module.ts:

@Module({
  imports: [
    ConfigModule.forFeature(emailConfig),
  ],
})
export class NotificationModule {}

email-notification.service.ts:

@Injectable()
export class EmailNotificationService {
  private secret: string;

  constructor(
    @Inject(emailConfig.KEY)
    private mailConfig: ConfigType<typeof emailConfig>,
  ) {
    this.secret = this.mailConfig.verificationSecret;
  }
}

Конечно, вам не нужно использовать пространства имен конфигурации, но он разбивает конфигурацию только на те части, которые вам нужны в конкретный модуль. Существует строгая типизация через интерфейс, а с Joi ваша схема проверяется и адаптируется к соответствующей среде.

...