有人能解释一下node.js中的“process.argv”是什么意思吗?

r1zhe5dt  于 2023-03-07  发布在  Node.js
关注(0)|答案(8)|浏览(220)

我目前正在学习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循环,所以您不必详细介绍它。
先谢谢你了。

kgqe7b3p

kgqe7b3p1#

快速执行console.log(process.argv),您将立即发现问题。
它从2开始,因为process.argv包含整个命令行调用:

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

元素01从脚本的Angular 来看不是“参数”,但它们是调用脚本的shell的参数。

klsxnrf1

klsxnrf12#

它以2开头,因为代码将使用

node myprogram.js firstarg secondarg

所以

process.argv[0] == "node"

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

process.argv[2] == "firstarg"

在线文档

67up9zun

67up9zun3#

您的程序打印提供给节点脚本的"命令行参数"的数值总和。

例如:

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

来自process.argv的Node.js API文档:
包含命令行参数的数组。第一个元素是"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'

另请参阅Number(...) function/contructor的JavaScript。

dgtucam1

dgtucam14#

在node.js中,命令行参数总是存储在一个数组中,在该数组中,第一个元素是我们所引用的node命令,因为我们以单词“node”开始命令行,第二个元素是我们所引用的javascript(JS)文件,它通常出现在node命令之后。
我们知道,JS数组的第一个元素从0开始,第二个元素是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]);
}
jdzmm42g

jdzmm42g5#

我的答案不是关于process.argv如何工作--因为这里有很多答案--而是关于如何使用array destructuring syntax获得值。
例如,如果使用以下命令运行脚本:

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 syntax来实现,它可以收集多个元素并把它们压缩成一个元素,如下所示:

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

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

当然,您可以省略process.argv的第一个和第二个 places,而只保留您的 params

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

dtcbnfnu6#

当你这样执行时:

node code.js <argument> <argument>....

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

vptzau2j

vptzau2j7#

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
kiz8lqtg

kiz8lqtg8#

process.agrv[i]-在执行文件时基本上循环通过终端中传递的命令行参数。例如-如果您将文件运行为
$节点prog.js 1 2 3,然后处理.argv[0]=1,依此类推。

相关问题