Avatar ·

Как передать аргументы командной строки в Node.js и получить их в коде?

Всем привет! Я новичок в Node.js и пытаюсь написать простую утилиту, которая принимает имя пользователя и приветствует его. Я запускаю скрипт через терминал так: node app.js Иван. Но как мне внутри кода получить это имя? Я пробовал читать документацию, но там сложно. Сейчас у меня есть такой код: ```javascript // app.js console.log("Привет, мир!"); ``` Я хочу, чтобы при запуске `node app.js Иван` выводилось "Привет, Иван!". Если я запускаю без аргументов, должно быть "Привет, гость!". Также интересует, как передавать несколько аргументов, например, имя и возраст: `node app.js Иван 25`. Как их разделить и обработать? И что делать, если аргумент содержит пробелы, например, полное имя "Иван Петров"? В командной строке я могу его в кавычки взять, но как это правильно распарсить в коде? Подскажите, пожалуйста, самый простой и надёжный способ. Желательно без установки сторонних библиотек, только на чистом Node.js. Я слышал про process.argv, но не совсем понимаю, как с ним работать. Буду благодарен за примеры.<<>>

Использование process.argv для получения аргументов командной строки

В Node.js все аргументы командной строки доступны через глобальный объект process.argv. Это массив строк, где:

  • Первый элемент (process.argv[0]) — путь к исполняемому файлу Node.js.
  • Второй элемент (process.argv[1]) — путь к вашему скрипту.
  • Все последующие элементы — непосредственно переданные аргументы.

Вот как решить вашу задачу с приветствием:

// app.js
const args = process.argv.slice(2); // отбрасываем первые два элемента

const name = args[0] || 'гость'; // если аргумент не передан, используем значение по умолчанию
console.log(`Привет, ${name}!`);

Теперь запуск node app.js Иван выведет Привет, Иван!, а node app.js — Привет, гость!.

Обработка нескольких аргументов

Если нужно передать имя и возраст:

// app.js
const args = process.argv.slice(2);

const [name, age] = args; // деструктуризация массива
if (!name) {
  console.log('Пожалуйста, укажите имя.');
  process.exit(1); // завершаем с ошибкой
}

const ageMessage = age ? `, возраст: ${age}` : '';
console.log(`Привет, ${name}!${ageMessage}`);

Запуск node app.js Иван 25 выведет: Привет, Иван!, возраст: 25.

Аргументы с пробелами

Если аргумент содержит пробелы, передавайте его в кавычках в командной строке:

node app.js "Иван Петров" 30

Node.js автоматически распарсит это как один аргумент "Иван Петров". Внутри кода он будет строкой Иван Петров. Никакой дополнительной обработки не требуется.

Продвинутая обработка: именованные аргументы (флаги)

Часто удобно использовать флаги в стиле --name или -n. Вот простой парсер без сторонних библиотек:

// app.js
const args = process.argv.slice(2);
const parsedArgs = {};

for (let i = 0; i < args.length; i++) {
  const arg = args[i];
  if (arg.startsWith('--')) {
    // Именованный аргумент: --name=Иван или --name Иван
    const [key, value] = arg.slice(2).split('=');
    parsedArgs[key] = value || args[++i]; // если нет "=", берём следующий аргумент
  } else if (arg.startsWith('-')) {
    // Короткий флаг: -n Иван
    const key = arg.slice(1);
    parsedArgs[key] = args[++i];
  } else {
    // Позиционный аргумент (если нужно)
    parsedArgs['_'] = parsedArgs['_'] || [];
    parsedArgs['_'].push(arg);
  }
}

console.log(parsedArgs);
// Пример: node app.js --name=Иван --age 25
// Вывод: { name: 'Иван', age: '25' }

Важные моменты

  • Все аргументы — строки. Числа нужно преобразовывать явно: Number(age) или +age.
  • Проверяйте наличие аргументов. Используйте || для значений по умолчанию или проверку if (!args[0]).
  • Для сложных CLI-приложений используйте готовые библиотеки: yargs, commander или minimist. Они обрабатывают флаги, типы данных, справку и многое другое.

Этот подход на чистом Node.js покрывает 90% повседневных задач. Удачи!

<<>>

Альтернативный подход: использование readline для интерактивного ввода

Если вы не хотите зависеть от аргументов командной строки, можно запрашивать данные у пользователя прямо во время выполнения скрипта. Это удобно для интерактивных утилит:

// app.js
const readline = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});

readline.question('Введите ваше имя: ', (name) => {
  console.log(`Привет, ${name || 'гость'}!`);
  readline.question('Введите возраст: ', (age) => {
    console.log(`Возраст: ${age || 'не указан'}`);
    readline.close();
  });
});

Такой подход хорош для простых скриптов, где пользователь запускает программу и вводит данные вручную. Недостаток — нельзя автоматизировать (например, в CI/CD или при вызове из другого скрипта).

Комбинированный подход

Можно объединить оба метода: сначала проверять аргументы командной строки, а если их нет — запрашивать интерактивно:

const args = process.argv.slice(2);
let name = args[0];

if (!name) {
  const readline = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout
  });
  readline.question('Введите имя: ', (input) => {
    console.log(`Привет, ${input}!`);
    readline.close();
  });
} else {
  console.log(`Привет, ${name}!`);
}

Это даёт гибкость: можно использовать как в автоматическом режиме, так и вручную.