Переменные окружения и .env
Переменная окружения — именованное значение, которое операционная система передаёт программе при запуске. В них хранят настройки, которые различаются на вашем компьютере и на сервере: порт, адрес базы данных, секретные ключи. Так одну и ту же программу можно запускать в разных местах, не меняя код.
process.env
Все переменные окружения лежат в объекте process.env. Значения в нём — всегда строки:
const port = Number(process.env.PORT ?? 3000);
console.log(`Порт: ${port}`);Если переменная PORT не задана, выведется «Порт: 3000». Число получают через Number(), а значение по умолчанию — через ??.
Задать переменную при запуске
В bash (Linux, macOS) переменную пишут перед командой:
PORT=8080 node app.jsВ PowerShell — отдельной строкой:
$env:PORT = "8080"; node app.jsВ обоих случаях программа выведет «Порт: 8080».
Файл .env
Набирать переменные каждый раз неудобно, поэтому их записывают в файл .env в корне проекта — рядом с package.json:
PORT=8080
BLOG_TITLE=Блог Анны
ADMIN_PASSWORD=change-meNode.js загрузит его, если передать флаг --env-file:
node --env-file=.env app.jsФлаг удобно сразу добавить в скрипт dev в package.json: "dev": "node --watch --env-file=.env src/server.js".
Загрузка из кода
Файл можно загрузить и из самой программы функцией process.loadEnvFile():
import { writeFile } from 'node:fs/promises';
await writeFile('.env', 'BLOG_TITLE=Блог Анны\nPOSTS_PER_PAGE=5\n');
process.loadEnvFile('.env');
console.log(process.env.BLOG_TITLE); // Блог Анны
console.log(Number(process.env.POSTS_PER_PAGE)); // 5Пример сначала создаёт .env, затем читает его. В настоящем проекте файл вы пишете сами, а в коде остаётся только process.loadEnvFile().
NODE_ENV
Многие библиотеки смотрят на переменную NODE_ENV. На сервере ей ставят значение production, и библиотеки отключают отладочные проверки:
const isProduction = process.env.NODE_ENV === 'production';
console.log(isProduction ? 'Боевой режим' : 'Режим разработки');Частая ошибка
Пароли и ключи нельзя писать прямо в коде, а файл .env нельзя добавлять в Git: иначе секреты увидит каждый, у кого есть доступ к репозиторию. Добавьте .env в .gitignore, а в репозитории держите файл .env.example с названиями переменных без значений:
PORT=
BLOG_TITLE=
ADMIN_PASSWORD=Новый участник проекта копирует его в .env и заполняет своими значениями.