我有一个用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中访问这些参数?不知怎么的,我在网上找不到这些信息。
当前回答
本地实验方法
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'
]
其他回答
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' }
NodeJS公开了一个名为process的全局变量。
我们可以使用:
process.argv
获取传递给脚本的命令行参数。
process.argv的输出将是以下顺序的列表:
[
full-path-to-node-executable,
full-path-to-the-script-file
...additonal-arguments-we-provide
]
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'
如果您的脚本名为myScript.js,并且希望将名和姓“Sean Worthington”作为如下参数传递:
node myScript.js Sean Worthington
然后在脚本中写下:
var firstName = process.argv[2]; // Will be set to 'Sean'
var lastName = process.argv[3]; // Will be set to 'Worthington'
最初的问题是要求传递命令行参数,而不是更复杂的参数解析。然而,面对所有复杂的答案,他们都错过了一个简单而有用的变化。
你知道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程序员知道这种用法