Как передать аргументы командной строки в программу Node.js? - PullRequest
2169 голосов
/ 04 декабря 2010

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

$ node server.js folder

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

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

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

Ответы [ 29 ]

4 голосов
/ 03 октября 2017

без библиотек

Если вы хотите сделать это в vanilla JS / ES6, вы можете использовать следующее решение

работал только в NodeJS> 6

const args = process.argv
  .slice(2)
  .map((val, i)=>{
    let object = {};
    let [regexForProp, regexForVal] = (() => [new RegExp('^(.+?)='), new RegExp('\=(.*)')] )();
    let [prop, value] = (() => [regexForProp.exec(val), regexForVal.exec(val)] )();
    if(!prop){
      object[val] = true;
      return object;
    } else {
      object[prop[1]] = value[1] ;
      return object
    }
  })
  .reduce((obj, item) => {
    let prop = Object.keys(item)[0];
    obj[prop] = item[prop];
    return obj;
  }, {});

И эта команда

node index.js host=http://google.com port=8080 production

даст следующий результат

console.log(args);//{ host:'http://google.com',port:'8080',production:true }
console.log(args.host);//http://google.com
console.log(args.port);//8080
console.log(args.production);//true

p.s. Пожалуйста, исправьте код на карте и уменьшите функцию если вы найдете более элегантное решение, спасибо;)

3 голосов
/ 22 мая 2018

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

Первым элементом массива process.argv всегда будет путь файловой системы, указывающий на исполняемый файл узла. Второй элемент - это имя файла JavaScript, который выполняется. И третий элемент - это первый аргумент, фактически переданный пользователем.

'use strict';

for (let j = 0; j < process.argv.length; j++) {  
    console.log(j + ' -> ' + (process.argv[j]));
}

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

Вы также можете использовать библиотеки, такие как yargs, для работы с аргументами commnadline.

2 голосов
/ 25 февраля 2019

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

Джозеф Мердриньяк опубликовал замечательный пример с использованием Reduce, но он опирался на синтаксис key=value вместо -k value и --key value. Я переписал его намного уродливее и дольше, чтобы использовать этот второй стандарт, и я опубликую его как ответ, потому что он не подходит в качестве комментария. Но это делает работу.

   const args = process.argv.slice(2).reduce((acc,arg,cur,arr)=>{
     if(arg.match(/^--/)){
       acc[arg.substring(2)] = true
       acc['_lastkey'] = arg.substring(2)
     } else
     if(arg.match(/^-[^-]/)){
       for(key of arg.substring(1).split('')){
         acc[key] = true
         acc['_lastkey'] = key
       }
     } else
       if(acc['_lastkey']){
         acc[acc['_lastkey']] = arg
         delete acc['_lastkey']
       } else
         acc[arg] = true
     if(cur==arr.length-1)
       delete acc['_lastkey']
     return acc
   },{})

С этим кодом команда node script.js alpha beta -charlie delta --echo foxtrot выдаст вам следующий объект


args = {
 "alpha":true,
 "beta":true,
 "c":true,
 "h":true,
 "a":true,
 "r":true
 "l":true,
 "i":true,
 "e":"delta",
 "echo":"foxtrot"
}
1 голос
/ 12 декабря 2018

Хотя вышеприведенные ответы идеальны, и кто-то уже предложил yargs, использовать пакет действительно просто.Это хороший пакет, который делает передачу аргументов в командную строку действительно простой.

npm i yargs
const yargs = require("yargs");
const argv = yargs.argv;
console.log(argv);

Пожалуйста, посетите https://yargs.js.org/ для получения дополнительной информации.

0 голосов
/ 25 января 2019

Лучший способ передать аргументы командной строки в программу Node.js - использовать интерфейс командной строки (CLI)

. Существует отличный модуль npm, называемый nodejs-cli Вы можете использовать.

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

0 голосов
/ 08 июня 2017

Простой фрагмент, если он понадобится:

var fs = require('fs'), objMod = {};

process.argv.slice(2).map(function(y, i) {
  y = y.split('=');
  if (y[0] && y[1]) objMod[y[0]] = y[1];
  else console.log('Error in argument number ' + (i+1));
});
0 голосов
/ 08 июня 2018

process.argv ваш друг, захват аргументов командной строки изначально поддерживается в Node JS. Смотрите пример ниже ::

process.argv.forEach((val, index) => {
  console.log(`${index}: ${val}`);
})
0 голосов
/ 25 апреля 2018

Большинство людей дали хорошие ответы.Я также хотел бы внести кое-что здесь.Я предоставляю ответ, используя библиотеку lodash для перебора всех аргументов командной строки, которые мы передаем при запуске приложения:

// Lodash library
const _ = require('lodash');

// Function that goes through each CommandLine Arguments and prints it to the console.
const runApp = () => {
    _.map(process.argv, (arg) => {
        console.log(arg);
    });
};

// Calling the function.
runApp();

Для запуска кода выше просто запустите следующие команды:

npm install
node index.js xyz abc 123 456

Результат будет:

xyz 
abc 
123
456
0 голосов
/ 24 апреля 2018

как указано в документации по узлу Свойство process.argv возвращает массив, содержащий аргументы командной строки, переданные при запуске процесса Node.js.

Например, предполагая следующий скрипт для process-args.js:

// print process.argv
process.argv.forEach((val, index) => {
   console.log(`${index}: ${val}`);
});

Запуск процесса Node.js как:

 $ node process-args.js one two=three four

Будет генерировать вывод:

0: /usr/local/bin/node
1: /Users/mjr/work/node/process-args.js
2: one
3: two=three
4: four
...