Настройки: @nestjs/config и .env
Некоторые значения отличаются на вашем компьютере и на сервере: порт, путь к базе данных, секретный ключ для токенов. Их не пишут в коде, а хранят в переменных окружения. Модуль @nestjs/config читает их из файла .env и отдаёт через сервис ConfigService.
Установка и файл .env
npm i @nestjs/configСоздайте файл .env в корне проекта, рядом с package.json:
PORT=3000
DB_PATH=blog.sqlite
JWT_SECRET=change-me-to-a-long-random-stringКаждая строка — имя переменной, знак равенства и значение. Кавычки не нужны.
Подключение модуля
// src/app.module.ts
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { PostsModule } from './posts/posts.module';
@Module({
imports: [ConfigModule.forRoot({ isGlobal: true }), PostsModule],
})
export class AppModule {}ConfigModule.forRoot() читает .env при запуске и добавляет значения в process.env. Параметр isGlobal: true делает ConfigService доступным во всех модулях без отдельного импорта.
Чтение настроек
ConfigService внедряется как любой сервис:
// src/app.controller.ts
import { Controller, Get } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
@Controller()
export class AppController {
constructor(private readonly config: ConfigService) {}
@Get('health')
health() {
return { status: 'ok', database: this.config.get<string>('DB_PATH') };
}
}Откройте http://localhost:3000/health — придёт {"status":"ok","database":"blog.sqlite"}. Метод get() возвращает undefined, если переменной нет; второй аргумент задаёт значение по умолчанию: get('PORT', 3000).
Для обязательных настроек есть getOrThrow(): если переменной нет, приложение сразу упадёт с понятной ошибкой, а не сломается позже.
// src/auth/auth.service.ts
const secret = this.config.getOrThrow<string>('JWT_SECRET');Порт в main.ts
В src/main.ts сервис достают из приложения методом app.get():
// src/main.ts
import { ConfigService } from '@nestjs/config';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
const config = app.get(ConfigService);
await app.listen(config.get('PORT', 3000));
}
bootstrap();Откуда берутся значения
| Источник | Приоритет |
|---|---|
| Переменные окружения системы | Выше |
Файл .env | Ниже |
Значение по умолчанию в get() | Если нет нигде |
Поэтому на сервере файл .env можно не создавать, а задать переменные средствами хостинга. Все значения из .env — строки: PORT придёт как "3000".
Частая ошибка
Файл .env с паролями и ключами попадает в Git. Проверьте, что строка .env есть в .gitignore, — в новом проекте NestJS её может не быть. Для других разработчиков сохраните в репозитории файл .env.example с теми же именами переменных, но без настоящих значений.