我有一个用Node.js编写的web服务器,我想用一个特定的文件夹启动。我不知道如何在JavaScript中访问参数。我运行的节点如下:
$ node server.js folder
这里server.js是我的服务器代码。Node.js帮助说这是可能的:
$ node -h
Usage: node [options] script.js [arguments]
如何在JavaScript中访问这些参数?不知怎么的,我在网上找不到这些信息。
我有一个用Node.js编写的web服务器,我想用一个特定的文件夹启动。我不知道如何在JavaScript中访问参数。我运行的节点如下:
$ node server.js folder
这里server.js是我的服务器代码。Node.js帮助说这是可能的:
$ node -h
Usage: node [options] script.js [arguments]
如何在JavaScript中访问这些参数?不知怎么的,我在网上找不到这些信息。
当前回答
在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等库来处理命令行参数。
其他回答
2018年答案基于当前野外趋势:
Vanilla javascript参数解析:
const args = process.argv;
console.log(args);
这将返回:
$ node server.js one two=three four
['node', '/home/server.js', 'one', 'two=three', 'four']
官方文件
用于参数分析的最常用的NPM包:
Minimist:用于最小参数解析。
Commander.js:参数解析最常用的模块。
喵:Commander.js的更轻替代品
Yargs:更复杂的参数解析(重)。
Vorpal.js:具有参数解析功能的成熟/交互式命令行应用程序。
大多数人都给出了很好的答案。我也想在这里做些贡献。我使用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
如节点文档中所述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
没有将标志格式化为简单对象的库
function getArgs () {
const args = {};
process.argv
.slice(2, process.argv.length)
.forEach( arg => {
// long arg
if (arg.slice(0,2) === '--') {
const longArg = arg.split('=');
const longArgFlag = longArg[0].slice(2,longArg[0].length);
const longArgValue = longArg.length > 1 ? longArg[1] : true;
args[longArgFlag] = longArgValue;
}
// flags
else if (arg[0] === '-') {
const flags = arg.slice(1,arg.length).split('');
flags.forEach(flag => {
args[flag] = true;
});
}
});
return args;
}
const args = getArgs();
console.log(args);
示例
易于理解的
输入
node test.js -D --name=Hello
输出
{ D: true, name: 'Hello' }
真实世界
输入
node config/build.js -lHRs --ip=$HOST --port=$PORT --env=dev
输出
{
l: true,
H: true,
R: true,
s: true,
ip: '127.0.0.1',
port: '8080',
env: 'dev'
}
虽然上面的答案很完美,而且已经有人建议了码数,但使用这个包确实很简单。这是一个很好的包,它使向命令行传递参数变得非常容易。
npm i yargs
const yargs = require("yargs");
const argv = yargs.argv;
console.log(argv);
请访问https://yargs.js.org/了解更多信息。