我有一个用Node.js编写的Web服务器,我想使用一个特定的文件夹启动。 我不确定如何在JavaScript中访问参数。 我正在像这样运行节点:

$ node server.js folder

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

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

如何在JavaScript中访问这些参数? 不知何故,我无法在网上找到此信息。


#1楼

使用nconf https://github.com/flatiron/nconf之类的集中方式来管理您的配置可能是一个好主意

它可以帮助您使用配置文件,环境变量,命令行参数。


#2楼

如果您的脚本名为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'

#3楼

Stdio图书馆

在NodeJS中解析命令行参数的最简单方法是使用stdio模块。 受UNIX getopt实用程序的启发,它很简单,如下所示:

var stdio = require('stdio');
var ops = stdio.getopt({'check': {key: 'c', args: 2, description: 'What this option means'},'map': {key: 'm', description: 'Another description'},'kaka': {args: 1, mandatory: true},'ooo': {key: 'o'}
});

如果使用此命令运行先前的代码:

node <your_script.js> -c 23 45 --map -k 23 file1 file2

然后ops对象将如下所示:

{ check: [ '23', '45' ],args: [ 'file1', 'file2' ],map: true,kaka: '23' }

因此,您可以根据需要使用它。 例如:

if (ops.kaka && ops.check) {console.log(ops.kaka + ops.check[0]);
}

还支持分组选项,因此您可以编写-om而不是-o -m

此外, stdio可以自动生成帮助/使用输出。 如果调用ops.printHelp() ,将得到以下内容:

USAGE: node something.js [--check <ARG1> <ARG2>] [--kaka] [--ooo] [--map]-c, --check <ARG1> <ARG2>   What this option means (mandatory)-k, --kaka                  (mandatory)--map                       Another description-o, --ooo

如果未给出强制性选项(错误消息之前)或如果选项不明确(例如,如果您为选项指定单个arg并且需要2),则还会显示上一条消息。

您可以使用NPM安装stdio模块:

npm install stdio

#4楼

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

文件: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']);

#5楼

这里有几个很好的答案,但这似乎非常复杂。 这与bash脚本访问参数值的方式非常相似,并且正如MooGoo所指出的那样,它已作为标准提供给node.js。 (只是使它对于node.js的新手来说是可以理解的)

例:

$ node yourscript.js banana monkeyvar 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"

#6楼

为此,它使用极简库来提供正确的答案。 我们曾经使用节点优化器,但此后不推荐使用。

这是一个如何使用它的示例,直接摘自简约文档:

var argv = require('minimist')(process.argv.slice(2));
console.dir(argv);

--

$ node example/parse.js -a beep -b boop
{ _: [], a: 'beep', b: 'boop' }

--

$ node example/parse.js -x 3 -y 4 -n5 -abc --beep=boop foo bar baz
{ _: [ 'foo', 'bar', 'baz' ],x: 3,y: 4,n: 5,a: true,b: true,c: true,beep: 'boop' }

#7楼

有一个应用程序。 好吧,模块。 好吧,不止一个,可能是数百个。

Yargs是有趣的工具之一,其文档很酷。

这是github / npm页面上的示例:

#!/usr/bin/env node
var argv = require('yargs').argv;
console.log('(%d,%d)', argv.x, argv.y);
console.log(argv._);

输出在这里(它读取带有破折号等的选项,长和短,数字等)。

$ ./nonopt.js -x 6.82 -y 3.35 rum
(6.82,3.35)
[ 'rum' ]
$ ./nonopt.js "me hearties" -x 0.54 yo -y 1.12 ho
(0.54,1.12)
[ 'me hearties', 'yo', 'ho' ]

#8楼

命令行参数值得一看!

您可以使用主要的注释标准来设置选项( 了解更多信息 )。 这些命令都是等效的,设置相同的值:

$ 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)

options现在看起来像这样:

{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时打印)。 请参阅下面的示例,并阅读文档以获取有关如何创建它们的说明。

一个典型的用法指南示例。

polymer-cli使用指南是一个很好的真实示例。

进一步阅读

还有很多要学习的内容,请参阅Wiki中的示例和文档。


#9楼

传递,解析参数是一个简单的过程。 Node为您提供了process.argv属性,该属性是一个字符串数组,这些字符串是调用Node时使用的参数。 数组的第一项是Node可执行文件,第二项是脚本的名称。

如果您使用以下参数运行脚本

$ node args.js arg1 arg2

文件:args.js

console.log(process.argv)

你会得到像

 ['node','args.js','arg1','arg2']

#10楼

基于当前野外趋势的2018年答案:


香草javascript参数解析:

const args = process.argv;
console.log(args);

返回:

$ node server.js one two=three four
['node', '/home/server.js', 'one', 'two=three', 'four']

官方文档


最常用的NPM软件包进行参数解析:

Minimist :用于最少的参数解析。

Commander.js :最常用的参数解析模块。

喵呜声 :Commander.js的更轻替代

Yargs :更复杂的参数解析(繁重)。

Vorpal.js :具有参数解析功能的成熟/交互式命令行应用程序。


#11楼

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'

#12楼

您可以使用system.args到达命令行参数。 而且我使用下面的解决方案将参数解析为一个对象,因此我可以按名称获取想要的对象。

var system = require('system');var args = {};
system.args.map(function(x){return x.split("=")}).map(function(y){args[y[0]]=y[1]});

现在您不需要知道参数的索引。 像args.whatever一样使用它

注意:您应该使用诸如file.js x=1 y=2类的命名参数来使用此解决方案。


#13楼

标准方法(无库)

参数存储在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

#14楼

一个简单的片段,如果有的话需要它:

var fs = require('fs'), objMod = {};process.argv.slice(2).map(function(y, i) {y = y.split('=');if (y[0] && y[1]) objMod[y[0]] = y[1];else console.log('Error in argument number ' + (i+1));
});

#15楼

没有图书馆

如果要在香草JS / ES6中执行此操作,则可以使用以下解决方案

仅在NodeJS> 6中有效

const args = process.argv.slice(2).map((val, i)=>{let object = {};let [regexForProp, regexForVal] = (() => [new RegExp('^(.+?)='), new RegExp('\=(.*)')] )();let [prop, value] = (() => [regexForProp.exec(val), regexForVal.exec(val)] )();if(!prop){object[val] = true;return object;} else {object[prop[1]] = value[1] ;return object}}).reduce((obj, item) => {let prop = Object.keys(item)[0];obj[prop] = item[prop];return obj;}, {});

而这个命令

node index.js host=http://google.com port=8080 production

将产生以下结果

console.log(args);//{ host:'http://google.com',port:'8080',production:true }
console.log(args.host);//http://google.com
console.log(args.port);//8080
console.log(args.production);//true

ps如果您找到更优雅的解决方案,请更正map中的代码并简化功能,谢谢;)


#16楼

完全免费:使用Array.prototype.reduce()

const args = process.argv.slice(2).reduce((acc, arg) => {let [k, v = true] = arg.split('=')acc[k] = vreturn acc}, {})

对于此命令node 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

自动解析布尔值和数字

console.log(args) // { count: 2, print: true, debug: false, msg: 'hi' }

#17楼

如节点文档中所述,process.argv属性返回一个数组,其中包含启动Node.js进程时传递的命令行参数。

例如,假设以下脚本用于process-args.js:

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

以以下方式启动Node.js进程:

 $ node process-args.js one two=three four

将生成输出:

0: /usr/local/bin/node
1: /Users/mjr/work/node/process-args.js
2: one
3: two=three
4: four

#18楼

大多数人都给出了很好的答案。 我也想在这里做点贡献。 我使用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

#19楼

在Node.js中检索参数的最简单方法是通过process.argv数组。 这是一个全局对象,无需导入任何其他库即可使用它。 就像我们前面展示的那样,您只需要将参数传递给Node.js应用程序,这些参数就可以通过process.argv数组在应用程序内进行访问。

process.argv数组的第一个元素将始终是指向节点可执行文件的文件系统路径。 第二个元素是正在执行的JavaScript文件的名称。 第三个元素是用户实际传递的第一个参数。

'use strict';for (let j = 0; j < process.argv.length; j++) {  console.log(j + ' -> ' + (process.argv[j]));
}

该脚本所做的全部工作是遍历process.argv数组,并打印索引以及存储在这些索引中的元素。 如果您怀疑要接收的参数以及接收顺序如何,这对于调试非常有用。

您也可以使用yargs之类的库来处理commnadline参数。


#20楼

process.argv是您的朋友,Node JS本身支持捕获命令行args。 请参见以下示例::

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

#21楼

proj.js

for(var i=0;i<process.argv.length;i++){console.log(process.argv[i]);
}

终奌站:

nodemon app.js "arg1" "arg2" "arg3"

结果:

0 'C:\\Program Files\\nodejs\\node.exe'
1 'C:\\Users\\Nouman\\Desktop\\Node\\camer nodejs\\proj.js'
2 'arg1' your first argument you passed.
3 'arg2' your second argument you passed.
4 'arg3' your third argument you passed.

说明:

0 :您的机器中的node.exe目录(C:\\ Program Files \\ nodejs \\ node.exe')

1 :项目文件的目录。 (proj.js)

2 :您对节点(arg1)的第一个参数

3 :您对节点(arg2)的第二个参数

4 :您对节点(arg3)的第三个参数

您的实际参数从argv数组的2nd索引开始,即process.argv[2]


#22楼

这是命名参数的0深度解决方案:

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

注意:当参数包含=时,这自然会失败。 这仅用于非常简单的用法。


#23楼

尽管上述答案很完美,并且有人已经建议过,但是使用该软件包确实非常容易。 这是一个很好的程序包,它使传递参数到命令行变得非常容易。

npm i yargs
const yargs = require("yargs");
const argv = yargs.argv;
console.log(argv);

请访问https://yargs.js.org/了解更多信息。


#24楼

没有标志格式化为简单对象的库

function getArgs () {const args = {};process.argv.slice(2, process.argv.length).forEach( arg => {// long argif (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;}// flagselse 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'
}

#25楼

将命令行参数传递给Node.js程序的最佳方法是使用命令行界面(CLI)

您可以使用一个漂亮的npm模块,称为nodejs-cli 。

如果您想创建一个没有依赖性的程序,我想在Github上创建一个程序,如果您想查看它,它实际上非常简单易用,请单击此处 。


#26楼

传递参数很容易,接收参数只是阅读process.argv数组Node基本上可以从任何地方进行访问。 但是您一定要将它们作为键/值对读取,因此您需要一段脚本来解释它。

约瑟夫· --key value Joseph Merdrignac)使用reduce --key value了一个漂亮的--key value ,但它依靠key=value语法而不是-k value--key value 。 我将其重写为更丑陋且使用第二个标准的时间更长,我将其发布为答案,因为它不适合用作评论。 但这确实完成了工作。

   const args = process.argv.slice(2).reduce((acc,arg,cur,arr)=>{if(arg.match(/^--/)){acc[arg.substring(2)] = trueacc['_lastkey'] = arg.substring(2)} elseif(arg.match(/^-[^-]/)){for(key of arg.substring(1).split('')){acc[key] = trueacc['_lastkey'] = key}} elseif(acc['_lastkey']){acc[acc['_lastkey']] = argdelete acc['_lastkey']} elseacc[arg] = trueif(cur==arr.length-1)delete acc['_lastkey']return acc},{})

使用此代码,命令node script.js alpha beta -charlie delta --echo foxtrot将为您提供以下对象


args = {"alpha":true,"beta":true,"c":true,"h":true,"a":true,"r":true"l":true,"i":true,"e":"delta","echo":"foxtrot"
}

#27楼

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

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

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


#28楼

ES6风格的无依赖性解决方案:

const longArgs = arg => {const [ key, value ] = arg.split('=');return { [key.slice(2)]: value || true }
};const flags = arg => [...arg.slice(1)].reduce((flagObj, f) => ({ ...flagObj, [f]: true }), {});const args = () =>process.argv.slice(2).reduce((args, arg) => ({...args,...((arg.startsWith('--') && longArgs(arg)) || (arg[0] === '-' && flags(arg)))}), {});
console.log(args());

#29楼

根据标准输入( --key=value )解析参数

const argv = (() => {const arguments = {};process.argv.slice(2).map( (element) => {const matches = element.match( '--([a-zA-Z0-9]+)=(.*)');if ( matches ){arguments[matches[1]] = matches[2].replace(/^['"]/, '').replace(/['"]$/, '');}});return arguments;
})();

命令示例

node app.js --name=stackoverflow --id=10 some-another-argument --text="Hello World"

argv的结果: console.log(argv)

{name: "stackoverflow",id: "10",text: "Hello World"
}

#30楼

乐观主义者(节点最优主义者)

查看乐观主义者库 ,它比手工分析命令行选项要好得多。

更新资料

不赞成使用乐观主义者。 尝试yargs ,它是乐观主义者的积极分支。


#31楼

Commander.js

对于定义选项,操作和参数非常有用。 它还会为您生成帮助页面。

及时

如果您喜欢回调方法,则非常适合从用户那里获取输入。

共同提示

如果您喜欢生成器方法,则非常适合从用户那里获取输入。

如何将命令行参数传递给Node.js程序?相关推荐

  1. linux如何进入解释器路径,如何更改解释器路径并将命令行参数传递给Linux上的可执行共享库?...

    以下是"可执行"共享库的最小示例(假定文件名:)mini.c: // Interpreter path is different on some systems //+defini ...

  2. python将argv作为参数_在jupyter / ipython notebook中将命令行参数传递给argv

    经过大量的环顾后,我发现了非常繁琐的自定义库,但是用几行代码解决了它,我认为这些代码很漂亮.我使用nbconvert最终得到一个html报告作为输出,包含笔记本中的所有图形和降价,但是通过最小的pyt ...

  3. c语言调用exe并传递参数,如何使用execlp将命令行参数传递给C程序

    This page包括大量的使用示例.... 编辑:从链接 从链路的代码段添加的代码片段上方 static void show_info_page(const char *git_cmd) { con ...

  4. 控制台发送get命令_.NET Core使用命令行参数库构建控制台应用程序

    前言 在我们开发中可能需要设计一次性应用程序,这些实用程序可以利用接近原始源代码的优势,但可以在与主Web应用程序完全独立的安全性上下文中启动.具体在 [管理过程](https://12factor. ...

  5. java中的命令行参数_Java中的命令行参数

    java中的命令行参数 Command-line arguments in Java are used to pass arguments to the main program. If you lo ...

  6. 命令行参数是什么?如何去使用它?

    有时你想在运行程序时将信息传递到一个程序中.这通过将命令行参数传递给main()来实现.命令行参数是程序执行时在命令行中紧跟在程序名后的信息. 在Java程序中访问命令行参数是相当容易的--它们作为字 ...

  7. java 接收命令行参数_java中的命令行参数_Java中的命令行参数

    java中的命令行参数 Command-line arguments in Java are used to pass arguments to the main program. If you lo ...

  8. Java 命令行参数

    Java 命令行参数 我们可以通过将命令行参数传递给main() 来将信息传递到程序中. 命令行参数是命令行上直接跟在程序名称后面的信息,当它 执行. 要访问 Java 程序中的命令行参数,请在 传递 ...

  9. 在 Perl 中使用 Getopt::Long 模块来接收用户命令行参数

    我们在linux常常用到一个程序需要加入参数,现在了解一下 perl 中的有关控制参数的模块 Getopt::Long ,比直接使用 @ARGV 的数组强大多了.我想大家知道在 Linux 中有的参数 ...

最新文章

  1. 阿里云云服务器ECS上的Ubuntu16.04桌面安装及root账户登录错误处理
  2. matlab做pca人脸识别,[转载]一个修改后的PCA进行人脸识别的Matlab代码,识
  3. rust(49)-图像(2)
  4. LeetCode 974. 和可被 K 整除的子数组(哈希map)
  5. source insight 配置
  6. node.js打开指定浏览器的四种方式
  7. 【Vue】—处理边界情况
  8. matlab 查找脉冲产生时间,脉冲时间信号MATLAB表示
  9. 安装Genymotion步骤,启动模拟器时显示CPU不支持虚拟化—解决方法:惠普主机开启VT虚拟化CPU
  10. WGS84坐标系、Web墨卡托、GCJ02坐标系、BD09坐标系—常用坐标系简述
  11. html教程:网页字体的设置
  12. linux限制用户登录失败次数
  13. 如何利用cyclone对SPC560离线烧写
  14. java 检测表情符号_hutool工具包:判断一个字符串中是否包含emoji表情符号(emoji-java)...
  15. pscp使用详解 Win与Linux文件互传工具
  16. Linux_计划任务
  17. 下列不属于C语言程序开发步骤,程序设计技术(C语言)-中国大学mooc-题库零氪...
  18. resent101-DSSD报错solution
  19. ASP.NETwebService通过企业微信API向用户推送消息
  20. MG995舵机工作原理及基于STM32的驱动源代码

热门文章

  1. 多线程编程 之 (生产者与消费者(N多))同步常用的方法。
  2. Android stadio 关联源码
  3. 第十、十一周项目一-点-圆-圆柱类族的设计(1)
  4. 从源码的角度分析MapReduce的map-input流程
  5. JVM判断对象是否已死?
  6. Dart Metadata 使用
  7. 牛客练习赛40 A.小D的剧场
  8. Trie树【洛谷P3879】 [TJOI2010]阅读理解
  9. Fiddler抓取https的设置
  10. Android初学第29天