NestJS — це потужний фреймворк для створення ефективних і масштабованих серверних додатків. Однією з поширених вимог під час розробки додатків є керування конфігурацією для різних середовищ. Це зазвичай досягається за допомогою змінних середовища, і в цій статті ми розглянемо, як ефективно працювати із змінними середовища в NestJS. Ми будемо використовувати TypeScript для забезпечення типобезпеки, що є однією з основних переваг використання NestJS.
Чому варто використовувати змінні середовища?
Змінні середовища дозволяють зберігати значення конфігурації поза межами нашого коду. Ця практика має кілька переваг:
- Безпека: Чутлива інформація, така як API ключі або паролі до баз даних, не захардкожена в наших вихідних файлах.
- Гнучкість: Легко переключатися між різними конфігураціями для середовищ розробки, тестування та продакшн.
- Послідовність: Допомагає підтримувати послідовність у різних середовищах.
Налаштування @nestjs/config
NestJS надає пакет @nestjs/config
для легкого керування змінними середовища. Почнемо з встановлення цього пакету:
npm install @nestjs/config
Тепер створимо файл .env
в корені вашого проекту, щоб зберігати змінні середовища:
.env
DATABASE_HOST=localhost
DATABASE_PORT=5432
DATABASE_USER=testuser
DATABASE_PASSWORD=testpassword
DATABASE_NAME=testdb
Далі налаштуємо ваш додаток NestJS для зчитування цього файлу .env
. Імпортуємо ConfigModule
та ConfigService
в app.module.ts
:
import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true, // Робить конфігурацію доступною глобально
}),
// Інші модулі
],
controllers: [],
providers: [],
})
export class AppModule {}
З цією конфігурацією ми можемо тепер інжектувати та використовувати ConfigService
у нашому додатку.
Використання ConfigService у вашому додатку
Щоб продемонструвати, як використовувати ConfigService
, давайте створимо модуль бази даних, який використовуватиме наші змінні середовища.
По-перше, створимо файл database.service.ts
:
import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
@Injectable()
export class DatabaseService {
constructor(private configService: ConfigService) {}
getDatabaseConfig() {
return {
host: this.configService.get('DATABASE_HOST'),
port: this.configService.get('DATABASE_PORT'),
username: this.configService.get('DATABASE_USER'),
password: this.configService.get('DATABASE_PASSWORD'),
dbName: this.configService.get('DATABASE_NAME'),
};
}
}
ConfigService
надає метод get
, який ми використовуємо для отримання змінних середовища.
Зверніть увагу, що ми також вказуємо тип, який очікуємо від цих змінних, для забезпечення типобезпеки.
Тепер інтегруємо DatabaseService
в модуль:
import { Module } from '@nestjs/common';
import { DatabaseService } from './database.service';
@Module({
providers: [DatabaseService],
exports: [DatabaseService],
})
export class DatabaseModule {}
Нарешті, використаємо конфігурацію бази даних у вашому додатку:
import { Controller, Get } from '@nestjs/common';
import { DatabaseService } from './database/database.service';
@Controller()
export class AppController {
constructor(private databaseService: DatabaseService) {}
@Get('db-config')
getDatabaseConfig() {
return this.databaseService.getDatabaseConfig();
}
}
Розширена конфігурація
Модуль @nestjs/config
також дозволяє реалізувати більш складні випадки використання, такі як валідація змінних середовища та використання схем.
Валідація змінних середовища
Щоб забезпечити цілісність та дійсність змінних середовища, можна використовувати схему валідації за допомогою бібліотеки Joi
.
По-перше, встановіть Joi
:
npm install joi
Далі створіть схему валідації та застосуйте її до вашого ConfigModule
:
import * as Joi from '@hapi/joi';
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
@Module({
imports: [
ConfigModule.forRoot({
validationSchema: Joi.object({
DATABASE_HOST: Joi.string().hostname().required(),
DATABASE_PORT: Joi.number().default(5432),
DATABASE_USER: Joi.string().required(),
DATABASE_PASSWORD: Joi.string().required(),
DATABASE_NAME: Joi.string().required(),
}),
validationOptions: {
allowUnknown: false,
abortEarly: true,
},
}),
// Інші модулі
],
controllers: [],
providers: [],
})
export class AppModule {}
Тут ми визначаємо схему, яка валідує наші змінні середовища. Якщо будь-яка зі змінних не відповідає критеріям, буде викинута помилка, що дозволяє швидше виявити неправильні конфігурації.
Висновок
Керування змінними середовища в додатку NestJS є простим за допомогою пакету @nestjs/config
. Він надає чистий та ефективний спосіб керування конфігурацією для різних середовищ, при цьому забезпечуючи типобезпеку та валідацію. Тримання чутливої інформації поза нашим вихідним кодом і використання послідовних конфігурацій дозволяє створювати більш безпечні та зручні для обслуговування додатки.
З NestJS та TypeScript ви отримуєте найкраще з обох світів: потужний бекенд-фреймворк і сильну типізацію для виявлення помилок ще до їх появи. Успіхів у кодуванні!
Перекладено з: Working with Environment Variables in NestJS