我有一个用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中访问这些参数?不知怎么的,我在网上找不到这些信息。
当前回答
虽然上面的答案很完美,而且已经有人建议了码数,但使用这个包确实很简单。这是一个很好的包,它使向命令行传递参数变得非常容易。
npm i yargs
const yargs = require("yargs");
const argv = yargs.argv;
console.log(argv);
请访问https://yargs.js.org/了解更多信息。
其他回答
我扩展了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' ]
}
本地实验方法
Nodejs团队在18.3.0和16.17.0版本中添加了util.parseArgs函数。因此,如果您使用这些或更高版本的nodejs,您可以使用本机解决方案解析命令行参数。
文档中的用法示例:
const {parseArgs} = require('node:util');
const args = process.argv;
const options = {
foo: {
type: 'boolean',
short: 'f'
},
bar: {
type: 'string'
}
};
const {
values,
positionals
} = parseArgs({ args, options, allowPositionals: true });
console.log(values);
console.log(positionals);
输出样本:
$ node parseargs.js -f --bar b
[Object: null prototype] { foo: true, bar: 'b' }
[
'/Users/mbelsky/.nvm/versions/node/v18.12.1/bin/node',
'/Users/mbelsky/parseargs.js'
]
标准方法(无库)
参数存储在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
为了像常规javascript函数那样规范化参数,我在node.js shell脚本中执行以下操作:
var args = process.argv.slice(2);
注意,第一个参数通常是nodejs的路径,第二个参数是您正在执行的脚本的位置。
最初的问题是要求传递命令行参数,而不是更复杂的参数解析。然而,面对所有复杂的答案,他们都错过了一个简单而有用的变化。
你知道Unix shell支持命名参数吗?这可以追溯到20世纪80年代最初的伯恩贝壳。用法很简单:
$ FOO=one BAR=two nodejs myscript.js
要获取Javascript中的参数:
var foo = process.env.FOO;
var bar = process.env.BAR;
一旦超过两个或三个参数,命名参数就更容易读取。可选参数很简单,顺序也不固定。
(这甚至可以在Windows上运行,因为最近支持Unix shell。)
而且,几乎没有Unix程序员知道这种用法