7. process, env, аргументы

process — глобальный объект в Node.js. Содержит информацию о текущем процессе и позволяет управлять им.
Переменные окружения (.env)
Заголовок раздела «Переменные окружения (.env)»# .env файл — НЕ коммить в git!PORT=3000NODE_ENV=developmentDATABASE_URL=postgresql://user:password@localhost:5432/mydbJWT_SECRET=super-secret-key-change-in-productionAPI_KEY=abc123xyz// Загрузка .env через dotenvrequire('dotenv').config();// или в ESM: import 'dotenv/config';
// Теперь переменные доступны в process.envconst port = process.env.PORT || 3000;const env = process.env.NODE_ENV || 'development';const dbUrl = process.env.DATABASE_URL;
console.log(`Запуск в режиме: ${env}`);console.log(`Порт: ${port}`);Конфиг-модуль (лучшая практика)
Заголовок раздела «Конфиг-модуль (лучшая практика)»// src/config.js — централизованная конфигурацияrequire('dotenv').config();
function requireEnv(name) { const value = process.env[name]; if (!value) { throw new Error(`Переменная окружения ${name} не установлена!`); } return value;}
const config = { // Сервер port: parseInt(process.env.PORT || '3000', 10), host: process.env.HOST || '0.0.0.0', env: process.env.NODE_ENV || 'development',
// База данных db: { url: requireEnv('DATABASE_URL'), poolSize: parseInt(process.env.DB_POOL_SIZE || '10', 10), },
// JWT jwt: { secret: requireEnv('JWT_SECRET'), expiresIn: process.env.JWT_EXPIRES_IN || '7d', },
// Вычисляемые свойства get isDev() { return this.env === 'development'; }, get isProd() { return this.env === 'production'; }, get isTest() { return this.env === 'test'; },};
module.exports = config;// Использованиеconst config = require('./config');
const app = express();app.listen(config.port, () => { console.log(`Сервер на порту ${config.port} (${config.env})`);});Аргументы командной строки
Заголовок раздела «Аргументы командной строки»// process.argv — массив аргументов// process.argv[0] — путь к node// process.argv[1] — путь к скрипту// process.argv[2+] — пользовательские аргументы
// node script.js --port=3000 --env=productionconsole.log(process.argv);// ['node', 'script.js', '--port=3000', '--env=production']
// Разбор аргументов вручнуюconst args = process.argv.slice(2);const options = {};for (const arg of args) { const [key, value] = arg.replace('--', '').split('='); options[key] = value;}console.log(options); // { port: '3000', env: 'production' }
// Лучше использовать пакет minimist или yargsconst minimist = require('minimist');const argv = minimist(process.argv.slice(2));console.log(argv.port); // 3000console.log(argv.env); // productionИнформация о процессе
Заголовок раздела «Информация о процессе»// Версия Node.jsconsole.log(process.version); // v20.11.0console.log(process.versions.node); // 20.11.0console.log(process.versions.v8); // 11.3.244.8
// Платформа и архитектураconsole.log(process.platform); // linux / darwin / win32console.log(process.arch); // x64 / arm64
// Рабочая директорияconsole.log(process.cwd()); // /home/user/project
// ID процессаconsole.log(process.pid); // 12345
// Время работы в секундахconsole.log(process.uptime()); // 10.234
// Использование памятиconst mem = process.memoryUsage();console.log(`Heap: ${Math.round(mem.heapUsed / 1024 / 1024)} МБ`);console.log(`RSS: ${Math.round(mem.rss / 1024 / 1024)} МБ`);
// Время CPUconst cpu = process.cpuUsage();console.log('CPU user:', cpu.user, 'микросекунд');Управление процессом
Заголовок раздела «Управление процессом»// Завершение процессаprocess.exit(0); // успешное завершениеprocess.exit(1); // с ошибкой
// Обработка сигналов ОСprocess.on('SIGTERM', () => { console.log('Получен SIGTERM (docker stop, kill)'); gracefulShutdown();});
process.on('SIGINT', () => { console.log('Получен SIGINT (Ctrl+C)'); gracefulShutdown();});
async function gracefulShutdown() { console.log('Завершение работы...'); // Закрываем соединения, заканчиваем запросы await server.close(); await database.disconnect(); console.log('Завершено!'); process.exit(0);}
// Необработанные исключенияprocess.on('uncaughtException', (err) => { console.error('Необработанное исключение:', err); process.exit(1); // обязательно завершаем!});
// Необработанные rejected Promiseprocess.on('unhandledRejection', (reason, promise) => { console.error('Необработанный rejection:', reason); process.exit(1);});Разные .env для окружений
Заголовок раздела «Разные .env для окружений».env # базовые значения (коммить).env.local # локальные переопределения (НЕ коммить).env.development # для development.env.production # для production.env.test # для тестов.env.example # шаблон для команды (коммить!)// Загрузка нужного файлаconst envFile = `.env.${process.env.NODE_ENV || 'development'}`;require('dotenv').config({ path: envFile });// Потом перезаписываем .env.localrequire('dotenv').config({ path: '.env.local', override: true });.env.example — для команды
Заголовок раздела «.env.example — для команды»# .env.example — коммить в git, реальные значения не писать!PORT=3000NODE_ENV=developmentDATABASE_URL=postgresql://USER:PASSWORD@HOST:PORT/DB_NAMEJWT_SECRET=your-secret-hereAPI_KEY=your-api-key-hereREDIS_URL=redis://localhost:6379Практика
Заголовок раздела «Практика»- Создай
.envфайл с переменными PORT, NODE_ENV, DB_URL - Напиши
config.jsмодуль, который читает env и выбрасывает ошибку если обязательная переменная не задана - Добавь
process.on('uncaughtException', ...)обработчик - Создай скрипт, принимающий аргумент
--port=XXXXи запускающий сервер на этом порту - Выведи информацию о памяти процесса через
process.memoryUsage()