如何将命令行参数传递给Node.js程序?
我有一个用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程序?相关推荐
- linux如何进入解释器路径,如何更改解释器路径并将命令行参数传递给Linux上的可执行共享库?...
以下是"可执行"共享库的最小示例(假定文件名:)mini.c: // Interpreter path is different on some systems //+defini ...
- python将argv作为参数_在jupyter / ipython notebook中将命令行参数传递给argv
经过大量的环顾后,我发现了非常繁琐的自定义库,但是用几行代码解决了它,我认为这些代码很漂亮.我使用nbconvert最终得到一个html报告作为输出,包含笔记本中的所有图形和降价,但是通过最小的pyt ...
- c语言调用exe并传递参数,如何使用execlp将命令行参数传递给C程序
This page包括大量的使用示例.... 编辑:从链接 从链路的代码段添加的代码片段上方 static void show_info_page(const char *git_cmd) { con ...
- 控制台发送get命令_.NET Core使用命令行参数库构建控制台应用程序
前言 在我们开发中可能需要设计一次性应用程序,这些实用程序可以利用接近原始源代码的优势,但可以在与主Web应用程序完全独立的安全性上下文中启动.具体在 [管理过程](https://12factor. ...
- java中的命令行参数_Java中的命令行参数
java中的命令行参数 Command-line arguments in Java are used to pass arguments to the main program. If you lo ...
- 命令行参数是什么?如何去使用它?
有时你想在运行程序时将信息传递到一个程序中.这通过将命令行参数传递给main()来实现.命令行参数是程序执行时在命令行中紧跟在程序名后的信息. 在Java程序中访问命令行参数是相当容易的--它们作为字 ...
- java 接收命令行参数_java中的命令行参数_Java中的命令行参数
java中的命令行参数 Command-line arguments in Java are used to pass arguments to the main program. If you lo ...
- Java 命令行参数
Java 命令行参数 我们可以通过将命令行参数传递给main() 来将信息传递到程序中. 命令行参数是命令行上直接跟在程序名称后面的信息,当它 执行. 要访问 Java 程序中的命令行参数,请在 传递 ...
- 在 Perl 中使用 Getopt::Long 模块来接收用户命令行参数
我们在linux常常用到一个程序需要加入参数,现在了解一下 perl 中的有关控制参数的模块 Getopt::Long ,比直接使用 @ARGV 的数组强大多了.我想大家知道在 Linux 中有的参数 ...
最新文章
- 阿里云云服务器ECS上的Ubuntu16.04桌面安装及root账户登录错误处理
- matlab做pca人脸识别,[转载]一个修改后的PCA进行人脸识别的Matlab代码,识
- rust(49)-图像(2)
- LeetCode 974. 和可被 K 整除的子数组(哈希map)
- source insight 配置
- node.js打开指定浏览器的四种方式
- 【Vue】—处理边界情况
- matlab 查找脉冲产生时间,脉冲时间信号MATLAB表示
- 安装Genymotion步骤,启动模拟器时显示CPU不支持虚拟化—解决方法:惠普主机开启VT虚拟化CPU
- WGS84坐标系、Web墨卡托、GCJ02坐标系、BD09坐标系—常用坐标系简述
- html教程:网页字体的设置
- linux限制用户登录失败次数
- 如何利用cyclone对SPC560离线烧写
- java 检测表情符号_hutool工具包:判断一个字符串中是否包含emoji表情符号(emoji-java)...
- pscp使用详解 Win与Linux文件互传工具
- Linux_计划任务
- 下列不属于C语言程序开发步骤,程序设计技术(C语言)-中国大学mooc-题库零氪...
- resent101-DSSD报错solution
- ASP.NETwebService通过企业微信API向用户推送消息
- MG995舵机工作原理及基于STM32的驱动源代码