我有一个用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中访问这些参数?不知怎么的,我在网上找不到这些信息。
当前回答
大多数人都给出了很好的答案。我也想在这里做些贡献。我使用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
其他回答
传递、解析参数是一个简单的过程。Node为您提供process.argv属性,它是字符串数组,是调用Node时使用的参数。数组的第一个条目是Node可执行文件,第二个条目是脚本的名称。
如果您使用以下参数运行脚本
$ node args.js arg1 arg2
文件:args.js
console.log(process.argv)
您将获得类似数组的
['node','args.js','arg1','arg2']
npm install ps-grab
如果您想运行以下内容:
node greeting.js --user Abdennour --website http://abdennoor.com
--
var grab=require('ps-grab');
grab('--username') // return 'Abdennour'
grab('--action') // return 'http://abdennoor.com'
或者类似于:
node vbox.js -OS redhat -VM template-12332 ;
--
var grab=require('ps-grab');
grab('-OS') // return 'redhat'
grab('-VM') // return 'template-12332'
我扩展了getArgs函数,只获取命令,以及标志(-f,--anotherflag)和命名的args(--data=blablabla):
模块
/**
* @module getArgs.js
* get command line arguments (commands, named arguments, flags)
*
* @see https://stackoverflow.com/a/54098693/1786393
*
* @return {Object}
*
*/
function getArgs () {
const commands = []
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
})
}
else {
// commands
commands.push(arg)
}
})
return { args, commands }
}
// test
if (require.main === module) {
// node getArgs test --dir=examples/getUserName --start=getUserName.askName
console.log( getArgs() )
}
module.exports = { getArgs }
用法示例:
$ node lib/getArgs test --dir=examples/getUserName --start=getUserName.askName
{
args: { dir: 'examples/getUserName', start: 'getUserName.askName' },
commands: [ 'test' ]
}
$ node lib/getArgs --dir=examples/getUserName --start=getUserName.askName test tutorial
{
args: { dir: 'examples/getUserName', start: 'getUserName.askName' },
commands: [ 'test', 'tutorial' ]
}
命令行参数值得一看!
您可以使用主要符号标准设置选项(了解更多信息)。这些命令都是等效的,设置相同的值:
$ 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获取示例和文档。
以下是我的命名参数的0-dep解决方案:
const args = process.argv
.slice(2)
.map(arg => arg.split('='))
.reduce((args, [value, key]) => {
args[value] = key;
return args;
}, {});
console.log(args.foo)
console.log(args.fizz)
例子:
$ node test.js foo=bar fizz=buzz
bar
buzz
注意:当参数包含=时,这自然会失败。这仅用于非常简单的用途。