Как передать аргументы командной строки в программу 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
- Доступ к аргументам командной строки
- Практический пример: сервер с путем к папке
- Расширенный парсинг аргументов
- Лучшие практики и обработка ошибок
- Альтернатива с переменными окружения
Понимание process.argv
В Node.js массив process.argv — это встроенный глобальный объект, который содержит аргументы командной строки, переданные при запуске процесса Node.js. Этот массив имеет определенную структуру, которую важно понимать:
process.argv[0]: Путь к исполняемому файлу Node.jsprocess.argv[1]: Путь к выполняемому JavaScript-файлуprocess.argv[2]и далее: Фактические аргументы командной строки, переданные скрипту
Ключевое замечание: Первые два элемента в
process.argvвсегда зарезервированы для исполняемого файла Node.js и имени файла скрипта, поэтому ваши реальные аргументы начинаются с индекса 2.
Например, при запуске:
node server.js folder
Массив process.argv будет выглядеть так:
[
'/path/to/node', // исполняемый файл Node.js
'/path/to/server.js', // ваш файл скрипта
'folder' // ваш первый аргумент
]
Доступ к аргументам командной строки
Вот основной способ доступа к аргументам командной строки в Node.js:
// 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' ]
Практический пример: сервер с путем к папке
Вот как можно реализовать ваш конкретный случай использования — запуск веб-сервера с определенной папкой:
// 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)}`);
});
Чтобы использовать этот сервер:
node server.js /путь/к/вашей/папке
Расширенный парсинг аргументов
Хотя process.argv работает для простых случаев, более сложные приложения выигрывают от использования специализированных библиотек для парсинга аргументов. Вот популярные варианты:
Использование yargs
npm install yargs
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
});
Использование:
node server.js -f /path/to/folder -p 8080
Использование Commander
npm install commander
const { program } = require('commander');
program
.requiredOption('-f, --folder <path>', 'Папка для обслуживания файлов')
.option('-p, --port <port>', 'Порт для запуска сервера', '3000')
.parse();
console.log('Конфигурация сервера:', program.opts());
Лучшие практики и обработка ошибок
При работе с аргументами командной строки соблюдайте эти лучшие практики:
1. Проверка входных данных
Всегда проверяйте аргументы перед использованием:
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. Предоставление инструкций по использованию
Помогите пользователям понять, как использовать ваш скрипт:
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. Обработка разных типов аргументов
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;
Альтернатива с переменными окружения
Для конфигурации чувствительных данных или когда вы предпочитаете не передавать аргументы напрямую, рассмотрите использование переменных окружения:
// 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] и использовать его для настройки функциональности обслуживания файлов.
Ключевые выводы:
- Используйте
process.argv.slice(2)для получения только аргументов, предоставленных пользователем - Всегда проверяйте аргументы перед использованием, чтобы предотвратить ошибки
- Рассмотрите использование библиотек для парсинга аргументов, таких как yargs или commander, для сложных приложений
- Предоставляйте четкие инструкции по использованию и сообщения об ошибках для лучшего пользовательского опыта
- Переменные окружения предлагают альтернативный подход для конфигурации
Для большинства простых приложений, таких как ваш веб-сервер, базовый подход с process.argv будет работать идеально. Однако по мере роста сложности вашего приложения, инвестиции в соответствующую библиотеку для парсинга аргументов сэкономит ваше время и обеспечит лучший пользовательский опыт.