Encodera

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

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

Оглавление

Настройки и переменные окружения

Порт, секретные ключи и путь к базе различаются на вашем компьютере и на сервере. Вписывать их в код нельзя: секреты попадут в Git, а для смены порта придётся править файлы. Такие значения передают через переменные окружения — пары «имя=значение», которые операционная система выдаёт процессу при запуске.

Файл .env

Создайте в корне проекта файл .env:

PORT=3000
SESSION_SECRET=длинная-случайная-строка-для-сессий
JWT_SECRET=другая-длинная-случайная-строка
DATABASE_FILE=blog.db

Сразу добавьте его в .gitignore, чтобы он не попал в репозиторий:

node_modules/
.env
blog.db

Загрузка файла

Node.js 22 сам умеет читать .env — флаг --env-file передаёт значения в процесс. Обновите скрипт в package.json:

{
  "scripts": {
    "dev": "node --watch --env-file=.env src/server.js",
    "start": "node src/server.js"
  }
}

Отдельный пакет вроде dotenv не нужен. На рабочем сервере переменные обычно задаются средствами хостинга или менеджера процессов, поэтому в start флага нет.

Модуль настроек

Чтобы не разбрасывать process.env по всему коду, соберите настройки в одном файле src/config.js:

// src/config.js
function required(name) {
  const value = process.env[name];
  if (!value) {
    throw new Error(`Не задана переменная окружения ${name}`);
  }
  return value;
}
 
export const config = {
  port: Number(process.env.PORT ?? 3000),
  isProduction: process.env.NODE_ENV === 'production',
  sessionSecret: required('SESSION_SECRET'),
  jwtSecret: required('JWT_SECRET'),
  databaseFile: process.env.DATABASE_FILE ?? 'blog.db',
};

Если обязательной переменной нет, приложение остановится сразу при запуске с понятным сообщением, а не упадёт позже на первом входе пользователя.

Использование

Остальные файлы импортируют config вместо прямого обращения к process.env:

// src/server.js
import app from './app.js';
import { config } from './config.js';
 
app.listen(config.port, () => {
  console.log(`Сервер запущен: http://localhost:${config.port}`);
});

Так же в src/app.js передайте config.sessionSecret в session(), а в src/db.js — config.databaseFile в new Database(). Поменяйте PORT в .env на 4000, и после перезапуска сервер откроется на http://localhost:4000.

Пример для коллег

Раз .env не попадает в Git, создайте рядом файл .env.example с теми же именами, но без настоящих значений. Новый разработчик скопирует его в .env и впишет свои.

Частая ошибка

Все переменные окружения — строки. Запись DEBUG=false даёт строку 'false', а она в условии считается истинной: if (process.env.DEBUG) выполнится. Сравнивайте явно — process.env.DEBUG === 'true' — и превращайте числа через Number(), как с портом в config.js.

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

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