Не знаком с 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 ваша схема проверяется и адаптируется к соответствующей среде.