НейроАгент

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

Узнайте, как получить доступ к аргументам командной строки в Node.js с помощью process.argv. Это полное руководство показывает, как передавать аргументы в ваши программы Node.js и обрабатывать их в коде с практическими примерами.

Вопрос

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

У меня есть веб-сервер, написанный на Node.js, и я хотел бы запустить его с определенной папкой. Я не уверен, как получить доступ к аргументам командной строки в JavaScript. Я запускаю Node.js следующим образом:

$ node server.js folder

Здесь server.js - это код моего сервера. Согласно документации Node.js, это возможно:

$ node -h
Usage: node [options] script.js [arguments]

Как получить доступ к этим аргументам в JavaScript? Я не смог найти эту информацию в интернете.

НейроАгент

Чтобы передать аргументы командной строки в программу Node.js и получить к ним доступ в коде, можно использовать массив process.argv, который содержит аргументы командной строки. При запуске node server.js folder аргумент “folder” будет доступен в process.argv[2], где первые два элемента — это путь к исполняемому файлу Node.js и имя файла скрипта.


Содержание


Понимание process.argv

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

  • process.argv[0]: Путь к исполняемому файлу Node.js
  • process.argv[1]: Путь к выполняемому JavaScript-файлу
  • process.argv[2] и далее: Фактические аргументы командной строки, переданные скрипту

Ключевое замечание: Первые два элемента в process.argv всегда зарезервированы для исполняемого файла Node.js и имени файла скрипта, поэтому ваши реальные аргументы начинаются с индекса 2.

Например, при запуске:

bash
node server.js folder

Массив process.argv будет выглядеть так:

javascript
[
  '/path/to/node',      // исполняемый файл Node.js
  '/path/to/server.js', // ваш файл скрипта
  'folder'             // ваш первый аргумент
]

Доступ к аргументам командной строки

Вот основной способ доступа к аргументам командной строки в Node.js:

javascript
// server.js
console.log('Всего аргументов:', process.argv.length);
console.log('Все аргументы:', process.argv);

// Доступ к отдельным аргументам
const folderArg = process.argv[2]; // Это будет 'folder'
console.log('Аргумент папки:', folderArg);

// Также можно использовать методы массива, чтобы исключить первые два элемента
const userArgs = process.argv.slice(2);
console.log('Аргументы пользователя:', userArgs);

При запуске этого кода с node server.js folder вывод будет таким:

Всего аргументов: 3
Все аргументы: [ '/path/to/node', '/path/to/server.js', 'folder' ]
Аргумент папки: folder
Аргументы пользователя: [ 'folder' ]

Практический пример: сервер с путем к папке

Вот как можно реализовать ваш конкретный случай использования — запуск веб-сервера с определенной папкой:

javascript
// server.js
const http = require('http');
const fs = require('fs');
const path = require('path');

// Получаем аргумент папки из командной строки
const folderPath = process.argv[2];

// Проверяем, что папка была указана
if (!folderPath) {
  console.error('Ошибка: Укажите путь к папке в качестве аргумента');
  console.log('Использование: node server.js <путь-к-папке>');
  process.exit(1);
}

// Проверяем, существует ли папка
if (!fs.existsSync(folderPath)) {
  console.error(`Ошибка: Папка "${folderPath}" не существует`);
  process.exit(1);
}

// Создаем HTTP-сервер
const server = http.createServer((req, res) => {
  const filePath = path.join(folderPath, req.url);
  
  fs.readFile(filePath, (err, data) => {
    if (err) {
      res.writeHead(404, { 'Content-Type': 'text/plain' });
      res.end('File not found');
    } else {
      res.writeHead(200);
      res.end(data);
    }
  });
});

// Запускаем сервер на порту 3000
const PORT = 3000;
server.listen(PORT, () => {
  console.log(`Сервер запущен на http://localhost:${PORT}/`);
  console.log(`Файлы обслуживаются из: ${path.resolve(folderPath)}`);
});

Чтобы использовать этот сервер:

bash
node server.js /путь/к/вашей/папке

Расширенный парсинг аргументов

Хотя process.argv работает для простых случаев, более сложные приложения выигрывают от использования специализированных библиотек для парсинга аргументов. Вот популярные варианты:

Использование yargs

bash
npm install yargs
javascript
const yargs = require('yargs/yargs');
const { hideBin } = require('yargs/helpers');

const argv = yargs(hideBin(process.argv))
  .option('port', {
    alias: 'p',
    type: 'number',
    description: 'Порт для запуска сервера',
    default: 3000
  })
  .option('folder', {
    alias: 'f',
    type: 'string',
    description: 'Папка для обслуживания файлов',
    demandOption: true
  })
  .help()
  .alias('help', 'h')
  .argv;

console.log('Конфигурация сервера:', {
  port: argv.port,
  folder: argv.folder
});

Использование:

bash
node server.js -f /path/to/folder -p 8080

Использование Commander

bash
npm install commander
javascript
const { program } = require('commander');

program
  .requiredOption('-f, --folder <path>', 'Папка для обслуживания файлов')
  .option('-p, --port <port>', 'Порт для запуска сервера', '3000')
  .parse();

console.log('Конфигурация сервера:', program.opts());

Лучшие практики и обработка ошибок

При работе с аргументами командной строки соблюдайте эти лучшие практики:

1. Проверка входных данных

Всегда проверяйте аргументы перед использованием:

javascript
const folderPath = process.argv[2];

if (!folderPath) {
  console.error('Ошибка: Требуется указать путь к папке');
  process.exit(1);
}

// Проверяем, является ли путь корректным
const fs = require('fs');
if (!fs.existsSync(folderPath)) {
  console.error(`Ошибка: Путь "${folderPath}" не существует`);
  process.exit(1);
}

// Проверяем, является ли это директорией
if (!fs.statSync(folderPath).isDirectory()) {
  console.error(`Ошибка: "${folderPath}" не является директорией`);
  process.exit(1);
}

2. Предоставление инструкций по использованию

Помогите пользователям понять, как использовать ваш скрипт:

javascript
if (process.argv.includes('--help') || process.argv.includes('-h')) {
  console.log(`
Использование: node server.js [опции]

Опции:
  -f, --folder <path>    Папка для обслуживания файлов (обязательно)
  -p, --port <port>      Порт для запуска сервера (по умолчанию: 3000)
  -h, --help             Показать это сообщение помощи

Примеры:
  node server.js -f /var/www
  node server.js --folder /var/www --port 8080
`);
  process.exit(0);
}

3. Обработка разных типов аргументов

javascript
const args = process.argv.slice(2);

// Поиск конкретных аргументов
const folderArg = args.find(arg => !arg.startsWith('-'));
const portArg = args.find(arg => arg.startsWith('--port')) || 
                args.find(arg => arg.startsWith('-p'));

const folderPath = folderArg || '/default/path';
const port = portArg ? parseInt(portArg.split('=')[1]) || parseInt(portArg.split(' ')[1]) : 3000;

Альтернатива с переменными окружения

Для конфигурации чувствительных данных или когда вы предпочитаете не передавать аргументы напрямую, рассмотрите использование переменных окружения:

javascript
// server.js
const folderPath = process.env.SERVER_FOLDER || process.argv[2];
const port = process.env.SERVER_PORT || 3000;

// Использование:
// С аргументами: node server.js /path/to/folder
// С переменными окружения: SERVER_FOLDER=/path/to/folder node server.js

Заключение

Доступ к аргументам командной строки в Node.js прост с использованием массива process.argv, где реальные аргументы начинаются с индекса 2. Для вашего случая использования веб-сервера вы можете извлечь путь к папке с помощью process.argv[2] и использовать его для настройки функциональности обслуживания файлов.

Ключевые выводы:

  1. Используйте process.argv.slice(2) для получения только аргументов, предоставленных пользователем
  2. Всегда проверяйте аргументы перед использованием, чтобы предотвратить ошибки
  3. Рассмотрите использование библиотек для парсинга аргументов, таких как yargs или commander, для сложных приложений
  4. Предоставляйте четкие инструкции по использованию и сообщения об ошибках для лучшего пользовательского опыта
  5. Переменные окружения предлагают альтернативный подход для конфигурации

Для большинства простых приложений, таких как ваш веб-сервер, базовый подход с process.argv будет работать идеально. Однако по мере роста сложности вашего приложения, инвестиции в соответствующую библиотеку для парсинга аргументов сэкономит ваше время и обеспечит лучший пользовательский опыт.