我有一个用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中访问这些参数?不知怎么的,我在网上找不到这些信息。
当前回答
whithout libraries:使用Array.protocol.reduce()
const args = process.argv.slice(2).reduce((acc, arg) => {
let [k, v = true] = arg.split('=')
acc[k] = v
return acc
}, {})
对于此命令节点,index.js count=2 print debug=false msg=hi
console.log(args) // { count: '2', print: true, debug: 'false', msg: 'hi' }
而且
我们可以改变
let [k, v = true] = arg.split('=')
acc[k] = v
由(更长)
let [k, v] = arg.split('=')
acc[k] = v === undefined ? true : /true|false/.test(v) ? v === 'true' : /[\d|\.]+/.test(v) ? Number(v) : v
自动分析布尔数字(&N)
console.log(args) // { count: 2, print: true, debug: false, msg: 'hi' }
其他回答
为了像常规javascript函数那样规范化参数,我在node.js shell脚本中执行以下操作:
var args = process.argv.slice(2);
注意,第一个参数通常是nodejs的路径,第二个参数是您正在执行的脚本的位置。
标准方法(无库)
参数存储在process.argv中
以下是关于处理命令行参数的节点文档:
process.argv是一个包含命令行参数的数组。第一个元素是“node”,第二个元素是JavaScript文件的名称。接下来的元素将是任何其他命令行参数。
// print process.argv
process.argv.forEach(function (val, index, array) {
console.log(index + ': ' + val);
});
这将产生:
$ node process-2.js one two=three four
0: node
1: /Users/mjr/work/node/process-2.js
2: one
3: two=three
4: four
命令行参数值得一看!
您可以使用主要符号标准设置选项(了解更多信息)。这些命令都是等效的,设置相同的值:
$ example --verbose --timeout=1000 --src one.js --src two.js
$ example --verbose --timeout 1000 --src one.js two.js
$ example -vt 1000 --src one.js two.js
$ example -vt 1000 one.js two.js
要访问这些值,首先创建一个选项定义列表,描述应用程序接受的选项。type属性是setter函数(提供的值通过该函数传递),使您能够完全控制接收的值。
const optionDefinitions = [
{ name: 'verbose', alias: 'v', type: Boolean },
{ name: 'src', type: String, multiple: true, defaultOption: true },
{ name: 'timeout', alias: 't', type: Number }
]
接下来,使用commandLineArgs()解析选项:
const commandLineArgs = require('command-line-args')
const options = commandLineArgs(optionDefinitions)
选项现在看起来如下:
{
src: [
'one.js',
'two.js'
],
verbose: true,
timeout: 1000
}
高级用法
除了上述典型用法外,还可以配置命令行参数以接受更高级的语法形式。
基于命令的语法(git样式),格式为:
$ executable <command> [options]
例如
$ git commit --squash -m "This is my commit message"
命令和子命令语法(docker样式),格式如下:
$ executable <command> [options] <sub-command> [options]
例如
$ docker run --detached --image centos bash -c yum install -y httpd
生成使用指南
可以使用命令行用法生成使用指南(通常在设置--help时打印)。请参阅下面的示例并阅读文档以了解如何创建它们。
典型的使用指南示例。
聚合物cli使用指南是一个很好的现实例子。
进一步阅读
还有很多需要学习的内容,请参见wiki获取示例和文档。
传递、解析参数是一个简单的过程。Node为您提供process.argv属性,它是字符串数组,是调用Node时使用的参数。数组的第一个条目是Node可执行文件,第二个条目是脚本的名称。
如果您使用以下参数运行脚本
$ node args.js arg1 arg2
文件:args.js
console.log(process.argv)
您将获得类似数组的
['node','args.js','arg1','arg2']
没有将标志格式化为简单对象的库
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'
}