1. Введение: зачем нужны аргументы командной строки
Когда вы запускаете Node.js-программу, вы можете передавать ей дополнительные параметры прямо в командной строке. Это удобно, если вы хотите, чтобы ваш скрипт работал по-разному в зависимости от входных данных, не переписывая код каждый раз.
Например, если бы вы писали калькулятор, то запускать его можно было бы так:
node calc.js 2 + 2
Или если вы делаете утилиту для копирования файлов:
node copy.js source.txt target.txt
Чтобы ваш скрипт мог узнать, что ему передали, Node.js предоставляет специальный объект — process, а в нём массив argv (от "argument vector" — вектор аргументов).
Модуль process: что это такое
В Node.js есть глобальный объект process. Он всегда доступен, не требует импорта и содержит информацию о процессе, в котором выполняется ваш скрипт. Через него можно узнать всё, что связано с текущим запуском: переменные окружения, pid, архитектуру, платформу, и, конечно, аргументы командной строки.
Пример использования:
console.log(process.platform); // Например, 'win32', 'linux' или 'darwin'
console.log(process.pid); // ID текущего процесса
console.log(process.env); // Объект с переменными окружения
Но сегодня нас интересует process.argv.
2. Чтение аргументов командной строки: process.argv
Как это работает
process.argv — это обычный массив, где хранятся все аргументы, с которыми был запущен Node.js-процесс.
- Первый элемент (process.argv[0]) — путь к исполняемому файлу Node.js (например, /usr/bin/node или C:\Program Files\nodejs\node.exe).
- Второй элемент (process.argv[1]) — путь к вашему скрипту (например, /home/user/app.js).
- Начиная с третьего элемента (process.argv[2] и далее) — это уже те параметры, которые вы указали при запуске.
Пример
Запустим такой скрипт:
// filename: printArgs.js
console.log(process.argv);
Выполним его:
node printArgs.js hello world 123
Результат:
[
'/usr/bin/node', // process.argv[0]
'/home/user/printArgs.js', // process.argv[1]
'hello', // process.argv[2]
'world', // process.argv[3]
'123' // process.argv[4]
]
Почему так? Почему не сразу с 0?
Это историческое наследие UNIX и C: первый элемент всегда путь к интерпретатору, второй — путь к исполняемому файлу. Дальше — уже ваши параметры.
3. Как использовать process.argv на практике
Мини-пример: калькулятор
Давайте напишем простейший калькулятор, который складывает два числа, переданных через командную строку.
// filename: sum.js
// Получаем аргументы (только нужные, начиная с третьего элемента)
const args = process.argv.slice(2);
const a = Number(args[0]);
const b = Number(args[1]);
console.log(`${a} + ${b} = ${a + b}`);
Запускаем:
node sum.js 5 7
В консоли увидим:
5 + 7 = 12
Немного защиты от дурака
В реальном мире пользователи бывают разными (даже если это вы сами ночью). Поэтому стоит проверить, что аргументы действительно есть и что это числа:
const args = process.argv.slice(2);
if (args.length < 2) {
console.error('Ошибка: Необходимо передать два числа.');
process.exit(1); // Завершаем процесс с ошибкой
}
const a = Number(args[0]);
const b = Number(args[1]);
if (isNaN(a) || isNaN(b)) {
console.error('Ошибка: Оба аргумента должны быть числами.');
process.exit(1);
}
console.log(`${a} + ${b} = ${a + b}`);
4. Разбор реального кейса: параметры для нашего приложения
Допустим, в ваших прошлых примерах вы делали приложение, которое выводит приветствие пользователю. Давайте теперь добавим возможность передавать имя пользователя через аргументы командной строки.
// filename: greet.js
const args = process.argv.slice(2);
const name = args[0] || 'Гость';
console.log(`Привет, ${name}!`);
node greet.js Вася
Вывод:
Привет, Вася!
Если имя не передано:
node greet.js
Вывод:
Привет, Гость!
5. Разбор аргументов: поддержка ключей и опций
В реальных CLI-утилитах часто встречаются именованные параметры, например:
node app.js --file=data.txt --mode=prod
Давайте научимся их разбирать вручную (без сторонних библиотек):
// filename: parseArgs.js
const args = process.argv.slice(2);
const options = {};
args.forEach(arg => {
// Проверяем, что аргумент начинается с --
if (arg.startsWith('--')) {
// Отрезаем "--" и разбиваем по знаку равенства
const [key, value] = arg.slice(2).split('=');
options[key] = value || true; // Если значение не указано, ставим true
}
});
console.log(options);
Запуск:
node parseArgs.js --file=data.txt --mode=prod --debug
Вывод:
{ file: 'data.txt', mode: 'prod', debug: true }
6. Типичные ошибки при работе с process.argv
Ошибка №1: Использование неправильных индексов при чтении аргументов.
Многие новички забывают, что первые два элемента — это путь к Node и путь к скрипту. В результате — программа работает не так, как ожидалось, или ругается на отсутствие аргументов.
Ошибка №2: Отсутствие проверки на количество и тип аргументов.
Если не проверить, что пользователь действительно передал нужное количество параметров, ваш скрипт может упасть с ошибкой или вести себя непредсказуемо.
Ошибка №3: Неявное преобразование типов.
Все аргументы приходят как строки. Если сразу использовать их как числа, можно получить неожиданные результаты ('2' + '2' даст '22', а не 4).
Ошибка №4: Несоответствие между документацией и фактическим порядком аргументов.
Если вы пишете инструкцию для пользователей, обязательно указывайте, как именно ожидать параметры: позиционно или по ключу.
Ошибка №5: Пробелы и кавычки в аргументах.
Если значение аргумента содержит пробелы, его нужно передавать в кавычках, иначе оно разобьётся на несколько элементов массива.
node greet.js "Иван Иванов"
В противном случае process.argv[2] будет "Иван", а process.argv[3] — "Иванов".
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ