Skip to main content
Практика завдань

Як керувати конфігурацією в NestJS за допомогою configmodule?

Управління конфігурацією в NestJS

NestJS надає @nestjs/config — модуль, який завантажує змінні середовища з файлів .env і надає їх через типобезпечний ConfigService.


Налаштування

bash
npm install @nestjs/config
typescript
// 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 joi
typescript
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

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.

Дочитали статтю?
Практика завдань