2015-02-28 5 views
2

Я изучаю, как использовать node.js, но у меня проблемы с анализом аргументов командной строки. Следующая строка:Аргументы командной строки парсингового узла

node test.js --input=in.txt 

дает ошибку синтаксического анализа, когда код достигает эту команду:

var fileName = JSONparse.(process.argv[2]); 

приведет к ошибке:

undefined 
--input=in.txt 

Syntax error: Unexpected number 

То, что я пытаюсь сделать, это создать необязательная переменная для входного файла. Если он не указан в командной строке, он должен перейти к «a.txt».

Я не нашел простой способ создания параметров по умолчанию или использовать идентификаторы, такие как '--input =', чтобы не беспокоиться о порядке, в котором передаются аргументы (я знаю, что это не имеет значения в этом случае с одним аргументом).

+1

Кстати, 'Синтаксическая ошибка' объясняется тем, что синтаксис JS плохой. Существует не 'JSONparse', и даже если бы это было,' JSONparse. ('Не имеет смысла;' .' является доступ к члену, поэтому вам нужен идентификатор после '.';' ('не работает Возможно, вы имели в виду 'JSON.parse (process.argv [2])', но это не имеет смысла, поскольку строка не является JSON. – Jacob

+0

Вы правы @Jacob, я имел в виду JSON.parse. : https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse –

ответ

0

Лучший вариант: использовать существующий синтаксический анализатор командной строки. Модуль yargs работает очень хорошо.

Если вы хотите бросить свои собственные, вот такой подход, который я бы взял. Во-первых, создать объект со всеми по умолчанию:

var opts = { 
    inputStream: process.stdin, 
    verbose: false 
}; 

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

for (var i = 2; i < process.argv.length; i++) { 
    var arg = process.argv[i]; 
    var keyValue = arg.split('='); 
    var key = keyValue[0], value = keyValue[1]; 
    if (key === '--input' || key === '-i') { 
     opts.inputStream = fs.createReadStream(value); 
    } 
    if (key === '---verbose' || key === '-v') { 
     opts.verbose = true; 
    } 
    // etc. 
} 
1

Vorpal.js является основой я сделал для построения интерактивного CLIs в Node. Как часть этого, он имеет встроенный API для простого синтаксического анализа команд.

Смежные вопросы