Как передать аргументы командной строки в Node.js и получить их в коде?
Использование 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}!`);
}
Это даёт гибкость: можно использовать как в автоматическом режиме, так и вручную.