Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Настройки: @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 с теми же именами переменных, но без настоящих значений.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.