Пошук уроків, статей та іншого контенту
Розглянете об’єкт process, властивості процесу та читання аргументів командного рядка через process.argv.
processprocess — глобальний об’єкт Node.js, який містить інформацію про поточний процес і дає змогу взаємодіяти з його середовищем.
Процес — це запущена копія програми. Коли ви виконуєте команду:
node app.jsNode.js запускає процес, завантажує файл app.js і виконує його код.
Об’єкт process доступний у будь-якому файлі Node.js без імпорту:
console.log(process);Повний об’єкт містить багато властивостей і методів, тому виведення всього process зазвичай дає великий обсяг інформації.
processВластивість process.version містить версію Node.js, під якою виконується програма:
console.log(process.version);Приклад результату:
v22.14.0Точне значення залежить від версії Node.js, встановленої у вашій системі.
Властивість process.pid містить числовий ідентифікатор поточного процесу:
console.log(process.pid);Цей ідентифікатор призначає операційна система.
Властивість process.platform показує платформу, на якій запущено Node.js:
console.log(process.platform);Поширені значення:
win32 — Windows;
linux — Linux;
darwin — macOS.
Це значення не завжди збігається з назвою операційної системи. Наприклад, для Windows Node.js використовує значення win32.
Метод process.cwd() повертає шлях до поточної робочої директорії:
console.log(process.cwd());Це директорія, з якої було запущено команду Node.js.
Наприклад, якщо виконати:
cd projects/my-app
node app.jsто process.cwd() поверне шлях до projects/my-app.
Поточна робоча директорія залежить від місця запуску команди, а не обов’язково від розташування файлу app.js.
Властивість process.env містить змінні середовища у вигляді об’єкта:
console.log(process.env);Окрему змінну можна прочитати за її назвою:
console.log(process.env.NODE_ENV);Якщо такої змінної немає, результатом буде undefined.
Змінні середовища часто використовують для налаштувань програми:
режиму запуску;
адреси сервера;
номера порту;
параметрів підключення до сервісів.
Не варто без потреби виводити весь process.env, оскільки там можуть бути секретні значення, наприклад паролі або ключі доступу.
Аргументи командного рядка — це значення, передані програмі під час її запуску.
Наприклад:
node app.js AliceУ цьому випадку Alice — аргумент командного рядка.
Node.js зберігає всі такі аргументи в масиві process.argv.
process.argvРозглянемо файл app.js:
console.log(process.argv);Запустимо його так:
node app.js Alice 25Масив матиме приблизно такий вигляд:
[
'/usr/local/bin/node',
'/home/user/app.js',
'Alice',
'25'
]Перші два елементи мають спеціальне призначення:
process.argv[0] — шлях до виконуваного файлу Node.js;
process.argv[1] — шлях до запущеного JavaScript-файлу;
process.argv[2] і наступні елементи — аргументи, передані програмі.
Отже, для команди:
node app.js Alice 25значення будуть такими:
process.argv[2] // "Alice"
process.argv[3] // "25"Усі аргументи в process.argv є рядками. Навіть 25 потрібно окремо перетворити на число, якщо програма має виконувати з ним математичні операції.
Створімо файл greet.js:
const name = process.argv[2] || 'світе';
const ageText = process.argv[3];
console.log(`Привіт, ${name}!`);
if (ageText !== undefined) {
const age = Number(ageText);
if (Number.isNaN(age)) {
console.error('Вік має бути числом.');
process.exitCode = 1;
} else {
console.log(`Тобі ${age} років.`);
}
}Запуск без аргументів:
node greet.jsРезультат:
Привіт, світе!Запуск з аргументами:
node greet.js Олена 28Результат:
Привіт, Олена!
Тобі 28 років.Якщо передати нечислове значення:
node greet.js Олена двадцятьРезультат:
Привіт, Олена!
Вік має бути числом.У прикладі використано оператор ||:
const name = process.argv[2] || 'світе';Якщо другий аргумент відсутній, process.argv[2] має значення undefined, тому змінна name отримає значення світе.
Такий підхід зручний, коли аргумент не є обов’язковим.
Якщо кількість аргументів невідома, можна отримати лише аргументи користувача за допомогою slice(2):
const userArguments = process.argv.slice(2);
for (const argument of userArguments) {
console.log(`Отримано аргумент: ${argument}`);
}Запуск:
node app.js first second thirdРезультат:
Отримано аргумент: first
Отримано аргумент: second
Отримано аргумент: thirdМетод slice(2) створює новий масив без перших двох системних елементів process.argv.
Аргументи часто передають у форматі --ключ=значення:
node app.js --name=Олена --language=ukПростий варіант читання таких аргументів:
const argumentsList = process.argv.slice(2);
const options = {};
for (const argument of argumentsList) {
const [key, value] = argument.split('=');
if (key.startsWith('--')) {
options[key.slice(2)] = value ?? true;
}
}
console.log(options);Результат:
{ name: 'Олена', language: 'uk' }У цьому прикладі:
slice(2) відкидає шлях до Node.js і шлях до файлу;
кожен аргумент розділяється на ключ і значення;
-- видаляється з початку ключа;
результат зберігається в об’єкті options.
Тепер значення можна використовувати так:
const name = options.name || 'користувачу';
console.log(`Привіт, ${name}!`);Для завершення процесу існує метод process.exit(), але використовувати його потрібно обережно:
process.exit(1);Число передає код завершення процесу:
0 зазвичай означає успішне завершення;
ненульове значення означає помилку.
Для встановлення коду завершення без негайного переривання програми краще використовувати process.exitCode:
process.exitCode = 1;Наприклад:
const value = process.argv[2];
if (value === undefined) {
console.error('Потрібно передати значення.');
process.exitCode = 1;
} else {
console.log(`Отримано: ${value}`);
}Так програма встановлює код помилки, але Node.js може коректно завершити виконання поточних операцій.
Неправильно:
const name = process.argv[0];process.argv[0] — це шлях до Node.js, а не аргумент користувача.
Правильно:
const name = process.argv[2];Усі значення з process.argv є рядками:
const first = process.argv[2];
const second = process.argv[3];
console.log(first + second);Для аргументів 2 і 3 результатом буде:
23Щоб виконати додавання чисел, потрібно перетворити значення:
const first = Number(process.argv[2]);
const second = Number(process.argv[3]);
console.log(first + second);Тепер результатом буде:
5Якщо аргумент не передано, його значенням буде undefined:
const name = process.argv[2];
console.log(name.toUpperCase());Без аргументу цей код завершиться помилкою, оскільки undefined не має методу toUpperCase().
Безпечний варіант:
const name = process.argv[2];
if (name === undefined) {
console.error('Передайте ім’я.');
process.exitCode = 1;
} else {
console.log(name.toUpperCase());
}process.cwd() і розташуванням файлуprocess.cwd() повертає директорію, з якої запустили команду. Якщо запустити файл з іншої директорії, результат може змінитися.
Тому не слід автоматично вважати, що process.cwd() — це директорія, у якій розташований поточний JavaScript-файл.
Створіть файл info.js, який:
отримує ім’я з першого аргументу командного рядка;
отримує місто з другого аргументу;
виводить привітання;
виводить платформу та поточну робочу директорію;
показує повідомлення про помилку, якщо ім’я або місто не передані.
Приклад запуску:
node info.js Андрій ЛьвівОчікуваний формат результату:
Привіт, Андрій з міста Львів!
Платформа: linux
Робоча директорія: /home/user/projectОдин із можливих варіантів реалізації:
const name = process.argv[2];
const city = process.argv[3];
if (!name || !city) {
console.error('Використання: node info.js <ім’я> <місто>');
process.exitCode = 1;
} else {
console.log(`Привіт, ${name} з міста ${city}!`);
console.log(`Платформа: ${process.platform}`);
console.log(`Робоча директорія: ${process.cwd()}`);
}process — глобальний об’єкт із інформацією про поточний процес Node.js.
process.version повертає версію Node.js.
process.pid повертає ідентифікатор процесу.
process.platform показує платформу операційної системи.
process.cwd() повертає поточну робочу директорію.
process.env містить змінні середовища.
process.argv містить аргументи командного рядка.
Перші два елементи process.argv — системні, тому аргументи користувача починаються з індексу 2.
Усі аргументи командного рядка мають тип string.
Перед використанням аргументи потрібно перевіряти та, за потреби, перетворювати на потрібний тип.