我有一个用Node.js编写的web服务器,我想用一个特定的文件夹启动。我不知道如何在JavaScript中访问参数。我运行的节点如下:

$ node server.js folder

这里server.js是我的服务器代码。Node.js帮助说这是可能的:

$ node -h
Usage: node [options] script.js [arguments]

如何在JavaScript中访问这些参数?不知怎么的,我在网上找不到这些信息。


当前回答

process.argv是您的朋友,在NodeJS中本机支持捕获命令行参数。参见以下示例:

process.argv.forEach((val, index) => {
  console.log(`${index}: ${val}`);
})

其他回答

为了像常规javascript函数那样规范化参数,我在node.js shell脚本中执行以下操作:

var args = process.argv.slice(2);

注意,第一个参数通常是nodejs的路径,第二个参数是您正在执行的脚本的位置。

这里有几个很好的答案,但似乎都很复杂。这与bash脚本访问参数值的方式非常相似,正如MooGoo所指出的,node.js已经为其提供了标准。(只是为了让node.js新手能够理解)

例子:

$ node yourscript.js banana monkey

var program_name = process.argv[0]; //value will be "node"
var script_path = process.argv[1]; //value will be "yourscript.js"
var first_value = process.argv[2]; //value will be "banana"
var second_value = process.argv[3]; //value will be "monkey"

您可以解析所有参数并检查它们是否存在。

文件:parse-cli-arguments.js:

module.exports = function(requiredArguments){
    var arguments = {};

    for (var index = 0; index < process.argv.length; index++) {
        var re = new RegExp('--([A-Za-z0-9_]+)=([A/-Za-z0-9_]+)'),
            matches = re.exec(process.argv[index]);

        if(matches !== null) {
            arguments[matches[1]] = matches[2];
        }
    }

    for (var index = 0; index < requiredArguments.length; index++) {
        if (arguments[requiredArguments[index]] === undefined) {
            throw(requiredArguments[index] + ' not defined. Please add the argument with --' + requiredArguments[index]);
        }
    }

    return arguments;
}

不仅仅是这样:

var arguments = require('./parse-cli-arguments')(['foo', 'bar', 'xpto']);
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'

最初的问题是要求传递命令行参数,而不是更复杂的参数解析。然而,面对所有复杂的答案,他们都错过了一个简单而有用的变化。

你知道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程序员知道这种用法