Переменные окружения и аргументы

Как передать программе настройки снаружи: секреты через окружение, параметры через аргументы.

Переменные окружения: process.env

Переменные окружения — это пары «ключ = значение», которые ОС передаёт программе. В них держат настройки, которые меняются между средами (разработка, продакшен), и секреты (пароли, ключи API), которые нельзя хранить в коде.

В Node к ним обращаются через объект process.env:

console.log(process.env.NODE_ENV);   // 'development' или 'production'
console.log(process.env.PORT);        // порт сервера
console.log(process.env.DATABASE_URL); // строка подключения к БД

Передать переменную можно прямо при запуске:

PORT=8080 NODE_ENV=production node app.js

Значение по умолчанию

Если переменная не задана, process.env вернёт undefined. Поэтому обычно подставляют значение по умолчанию:

// если PORT не задан — берём 3000
const port = process.env.PORT || 3000;
console.log("Сервер запустится на порту", port);

Логика выбора значения — чистый JavaScript, она реально исполнится:

function getConfig(env) {
  return {
    port: env.PORT || 3000,
    mode: env.NODE_ENV || "development",
    debug: env.DEBUG === "true"
  };
}

console.log(getConfig({ PORT: "8080", DEBUG: "true" }));
console.log(getConfig({}));

Вывод:

{ port: '8080', mode: 'development', debug: true }
{ port: 3000, mode: 'development', debug: false }

Обратите внимание: все значения process.envстроки. Число "8080" придётся привести через Number(), а булево сравнить со строкой "true".

Файл .env

Перечислять переменные в командной строке неудобно. На практике их кладут в файл .env (его не коммитят в git), а читают пакетом dotenv или встроенной поддержкой свежего Node:

PORT=8080
NODE_ENV=production
DATABASE_URL=postgres://localhost/mydb

Аргументы командной строки: process.argv

Аргументы, переданные при запуске, лежат в массиве process.argv. Первые два элемента — путь к node и путь к скрипту, дальше идут ваши аргументы:

// запуск: node greet.js Аня 25
console.log(process.argv);
// [
//   '/usr/bin/node',
//   '/path/greet.js',
//   'Аня',
//   '25'
// ]

const name = process.argv[2];
const age = process.argv[3];
console.log(`${name}, возраст ${age}`);

Обычно реальные аргументы достают, отрезав первые два элемента: process.argv.slice(2).

Разбор аргументов — обычный JS

Превратить «сырой» массив аргументов в удобный объект — чистая работа с массивом и строками:

// имитируем process.argv.slice(2)
const args = ["--name=Аня", "--age=25", "--admin"];

const options = {};
for (const arg of args) {
  const clean = arg.replace(/^--/, "");
  if (clean.includes("=")) {
    const [key, value] = clean.split("=");
    options[key] = value;
  } else {
    options[clean] = true; // флаг без значения
  }
}

console.log(options);

Вывод:

{ name: 'Аня', age: '25', admin: true }

Итог

  • process.env — переменные окружения; в них хранят настройки и секреты.
  • Все значения process.env — строки; используйте || значение по умолчанию.
  • Секреты держат в .env (не в git), читают через dotenv.
  • process.argv — аргументы запуска; реальные берут с .slice(2).
Проверьте себя
1. Какого типа значения в process.env?
AЧисла
BСтроки
CЛюбые типы
DБулевы
2. Что обычно хранят в переменных окружения?
AИсходный код
BНастройки среды и секреты (пароли, ключи)
CHTML-шаблоны
DЛоги приложения
3. Почему реальные аргументы берут через process.argv.slice(2)?
AЧтобы пропустить путь к node и путь к скрипту
BЧтобы убрать ошибки
CЭто требование npm
DЧтобы отсортировать их
Поддержать проект