JavaRush /Курсы /Модуль 4: Node.js, Next.js и Angular /Модуль process: process.argv, чтение аргументов

Модуль process: process.argv, чтение аргументов

Модуль 4: Node.js, Next.js и Angular
2 уровень , 8 лекция
Открыта

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]"Иванов".

1
Задача
Модуль 4: Node.js, Next.js и Angular, 2 уровень, 8 лекция
Недоступна
Проверка и обработка числовых аргументов
Проверка и обработка числовых аргументов
1
Задача
Модуль 4: Node.js, Next.js и Angular, 2 уровень, 8 лекция
Недоступна
Парсер опций командной строки (--ключ=значение)
Парсер опций командной строки (--ключ=значение)
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ