Як керувати конфігурацією в NestJS за допомогою configmodule?
Управління конфігурацією в NestJS
NestJS надає @nestjs/config — модуль, який завантажує змінні середовища з файлів .env і надає їх через типобезпечний ConfigService.
Налаштування
bash
npm install @nestjs/configtypescript
// app.module.ts
import { ConfigModule } from '@nestjs/config';
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true, // немає потреби імпортувати в кожному модулі
envFilePath: '.env',
cache: true, // кешувати значення для підвищення продуктивності
}),
],
})
export class AppModule {}Використання ConfigService
typescript
import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
@Injectable()
export class DatabaseService {
constructor(private configService: ConfigService) {}
getConnectionString(): string {
const host = this.configService.get<string>('DB_HOST');
const port = this.configService.get<number>('DB_PORT', 5432); // за замовчуванням 5432
const name = this.configService.get<string>('DB_NAME');
return `postgres://${host}:${port}/${name}`;
}
}Типізована конфігурація (з просторовими іменами)
typescript
// config/database.config.ts
import { registerAs } from '@nestjs/config';
export default registerAs('database', () => ({
host: process.env.DB_HOST || 'localhost',
port: parseInt(process.env.DB_PORT || '5432', 10),
name: process.env.DB_NAME || 'mydb',
password: process.env.DB_PASS,
}));
// app.module.ts
import databaseConfig from './config/database.config';
ConfigModule.forRoot({
isGlobal: true,
load: [databaseConfig],
})
// Використання:
const dbHost = this.configService.get<string>('database.host');
const dbPort = this.configService.get<number>('database.port');Валідація середовища з Joi
bash
npm install joitypescript
import * as Joi from 'joi';
ConfigModule.forRoot({
isGlobal: true,
validationSchema: Joi.object({
NODE_ENV: Joi.string().valid('development', 'production', 'test').required(),
PORT: Joi.number().default(3000),
DB_HOST: Joi.string().required(),
DB_PORT: Joi.number().default(5432),
DB_USER: Joi.string().required(),
DB_PASS: Joi.string().required(),
DB_NAME: Joi.string().required(),
JWT_SECRET: Joi.string().min(32).required(),
}),
validationOptions: {
allowUnknown: true,
abortEarly: false, // показати всі помилки одразу
},
})Якщо валідація не проходить, додаток відмовляється запускатися — виявляючи відсутні змінні середовища на ранньому етапі.
Використання Config в forRoot() (наприклад, TypeORM)
typescript
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
useFactory: (config: ConfigService) => ({
type: 'postgres',
host: config.get('DB_HOST'),
port: config.get<number>('DB_PORT'),
username: config.get('DB_USER'),
password: config.get('DB_PASS'),
database: config.get('DB_NAME'),
autoLoadEntities: true,
synchronize: config.get('NODE_ENV') !== 'production',
}),
inject: [ConfigService],
})Кілька файлів .env
typescript
ConfigModule.forRoot({
envFilePath: [
`.env.${process.env.NODE_ENV}.local`,
`.env.${process.env.NODE_ENV}`,
'.env.local',
'.env',
],
})Підсумок
Використовуйте ConfigModule.forRoot({ isGlobal: true }), щоб завантажити .env один раз і зробити ConfigService доступним скрізь. Додайте validationSchema з Joi для валідації необхідних змінних під час запуску. Використовуйте registerAs() для типізованих, просторових об'єктів конфігурації.
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.