请问在node.js中,"process.argv"是什么意思?

89

我目前正在学习Node.js,我很好奇这意味着什么。我正在学习中,请问您能告诉我为什么这段代码会产生这样的效果吗:

var result = 0;

  for (var i = 2; i < process.argv.length; i++){
    result += Number(process.argv[i]);
}
  console.log(result);

我知道它会将你添加到命令行的数字相加,但是为什么"i"从2开始?我理解for循环,所以您不必详细介绍。

非常感谢您提前的帮助。


26
值得一提的是,将其称为“argv”是从C语言继承下来的惯例,它表示参数向量(数组)。 - josh3736
9个回答

91

执行一下 console.log(process.argv) 命令,你就能立刻发现问题。

因为 process.argv 包含了整个命令行调用,所以从2开始计数:

process.argv = ['node', 'yourscript.js', ...]

对于脚本而言,元素01并不是“参数”,但对调用脚本的shell而言它们确实是。


6
0 和 1 是传递给 shell 的参数,其余的是传递给 node.js 的参数。 - jonschlinkert
2
@jonschlinkert 不是,1 是指 Node。 - not my real name

33

它以2开始是因为代码将会运行

node myprogram.js firstarg secondarg

那么

process.argv[0] == "node"

process.argv[1] == "myprogram.js"

process.argv[2] == "firstarg"

在线文档


6

您的程序打印出提供给节点脚本的“命令行参数”的数字值之和。

例如:

$ /usr/local/bin/node ./sum-process-argv.js 1 2 3
6

来自Node.js API文档process.argv

一个包含命令行参数的数组。第一个元素将是'node',第二个元素将是JavaScript文件的名称。接下来的元素将是任何额外的命令行参数。

在上面的示例中,这些值是:

process.argv[0] == '/usr/local/bin/node'
process.argv[1] == '/Users/maerics/src/js/sum-process-argv.js'
process.argv[2] == '1'
process.argv[3] == '2'
process.argv[4] == '3'

另请参阅 JavaScript 的 Number(...) 函数/构造函数


4

我的回答并不是关于如何使用process.argv的工作原理——因为这里有很多答案——相反,它是关于如何使用数组解构语法获取值的。

例如,如果您使用以下命令运行您的脚本:

node app.js arthur 35

您可以像这样以更易读的方式获取这些值:
const [node, script, name, age] = process.argv;

console.log(node); // node
console.log(script); // app.js
console.log(name); // arthur
console.log(age); // 35

您可以省略 process.argv 的第一个和第二个 位置,只保留 nameage

const [, , name, age] = process.argv;

如果你想要将所有参数放入一个数组中,可以使用rest 语法,它可以收集多个元素并将它们压缩成单个元素,就像这样:
const [node, script, ...params] = process.argv;

console.log(node); // node
console.log(script); // app.js
console.log(params); // [ 'arthur', '35' ]

当然,您可以省略process.argv的第一个和第二个参数,只保留您的参数:

const [, , ...params] = process.argv;

3
在node.js中,命令行参数总是存储在一个数组中。在该数组中,第一个元素是我们所指的node命令,因为我们以单词“node”开头开始命令行。第二个元素是我们所指的javascript(JS)文件,通常出现在node命令之后。
正如我们所知,在JS数组中,第一个元素从零开始,第二个元素为1,然后依次为2、3、4等。让我们将此数组命名为process.argv并添加命令行参数x和y。那么,这就是我们如何调用这些元素的方式:
var process.argv = ['node', 'file.js', ‘x’, ‘y’];
var process.argv [0] = node;
var process.argv [1]= file.js;
var process.argv[2] = x;
var process.argv[3] = y;

简而言之,元素0和1是node.js本身的,我们在编写任何命令行参数时都不使用它们。这就是为什么我们忽略0和1并始终从2开始的原因。
如果我们想要循环遍历命令行参数,同样需要从2开始。以下是我们用于循环遍历的代码。
for (i = 2; i < process.argv.length; i++){
console.log(process.argv[i]);
}

1
当你像这样执行它时:
node code.js <argument> <argument>....

它考虑了所有命令行调用。对于process.argv[]数组,将具有["node","code.js","<argument>",...]
因此,您在数组中以索引2开始的参数

0

app.js

const getHasCli = (prefix, alias = undefined) => {
  const prefixIndex = process.argv.findIndex(
    (arg) => arg === prefix || (alias && arg === alias)
  );
  return prefixIndex > 0;
};

const getCliData = (prefix, alias = undefined) => {
  let data = undefined;
  const prefixIndex = process.argv.findIndex(
    (arg) => arg === prefix || (alias && arg === alias)
  );
  if (prefixIndex > 0) {
    const cliData = process.argv[prefixIndex + 1] ?? undefined;
    if (cliData) {
      data = cliData.includes("-") ? undefined : cliData;
    }
  }
  return data;
};

(async () => {
  console.log(getCliData("--dir"));
  console.log(getCliData("--outDir"));
  console.log(getHasCli("--delete"));
  console.log(getHasCli("--ignore"));
})();

使用示例

node app.js --dir "./public" --delete

返回

./public
undefined
true
false

可以像这样使用:“console.log(getCliData("--dir", "-d"));" 第二个参数是别名。 - İbrahim Ödev

0
我意识到你的问题已经得到了回答,并且你的解释描述了一些这个答案不符合的标准。然而,你问题的标题似乎暗示了与描述不同的东西。
例如:“argv”是什么意思?“argv”里面有什么?。 我想知道的是第一个问题的答案,而不是最后一个问题,正因为标题的措辞,我点进了这个问题。
关于“argv”是什么意思?的答案,我发现是由于NodeJS的V8遗产。 Javascript引擎V8是用C++编写的,在C++中,main()函数(应用程序入口点)通常被写成:
int main(int argc, char* argv[])

在哪里:

argc 是提供的参数数量,即参数计数,

argv 是指向“向量”的指针,即参数向量。

NodeJS 提供 process.argv 作为一个数组,因此 C++ 主函数中使用的 argc 可以被 process.argv.length 替代,并且不需要提供。

据我所知,这就是 argv 的意思和它来自何处。 希望这对其他好奇的人有所帮助。


-4

process.argv[i] - 基本上循环遍历在终端执行文件时传递的命令行参数。 例如- 如果您运行以下文件
$ node prog.js 1 2 3 ,那么 process.argv[0]=1 等等..


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接