解析节点命令行参数

时间:2015-02-28 18:26:04

标签: json node.js command-line-arguments

我正在学习如何使用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 ='之类的标识符来不必担心参数传递的顺序(我知道在这种情况下它与无关紧要)一个论点)。

3 个答案:

答案 0 :(得分:1)

Vorpal.js是我在Node中构建交互式CLI的框架。作为其中的一部分,它具有内置的API,便于命令解析。

答案 1 :(得分:0)

最佳选择:使用现有的命令行解析器。 yargs模块运行良好。

如果你想自己动手,这就是我采取的方法。首先,创建一个包含所有默认值的对象:

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

...然后循环遍历args,随时替换选项。如果没有选项,则使用默认值:

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.
}

答案 2 :(得分:0)

如果要解析某些内容,则应为字符串化的JSON对象,否则解析结果将出错。 重要的是要知道节点js中的所有命令行参数都是字符串

let fileName = 'a.txt'

process.argv.slice(2).forEach((arg) => {
  if(arg.indexOf('--input') !== -1){
    if(arg.indexOf('=') !== -1){
      fileName = arg.split("=")[1].trim()
    } else {
      console.log('Error in providing command line argument')
    }
  }
})

console.log("File Name is ",fileName)

对于node index输出将为

  

文件名是a.txt

对于node index --input=hello.txt,输出将为

  

文件名是hello.txt