如何给 Node.js 程序传递并读取命令行参数?
Node.js 命令行参数通过 process.argv 数组读取:argv[0] 是 node 路径,argv[1] 是脚本路径,argv[2] 起才是你的参数。带选项的参数解析推荐 minimist 或 util.parseArgs。本文给出完整写法。
参数都在 process.argv 数组里:前两个元素是 node 可执行文件和脚本路径,你的参数从下标 2 开始。
基础用法
node task.js foo bar
process.argv.forEach((val, index) => {
console.log(index + ': ' + val);
});
// 0: /path/to/node
// 1: /path/to/task.js
// 2: foo
// 3: bar
实际使用通常直接切掉前两项:
const args = process.argv.slice(2);
console.log(args[0]); // foo
带选项的参数(--name=value 风格)
手写解析容易出错,Node 18.3+ 内置 util.parseArgs:
const { parseArgs } = require('util');
const { values } = parseArgs({
options: {
name: { type: 'string' },
force: { type: 'boolean', short: 'f' }
}
});
console.log(values.name, values.force);
node task.js --name=Tom -f
第三方库 minimist、commander(带子命令和自动帮助)功能更全,做正经 CLI 工具推荐 commander。
常见坑
- 参数都是字符串:
node task.js 8080拿到的是'8080',当端口用先Number(); - 带空格的参数要用引号:
node task.js "hello world"才是一个参数; - npm scripts 传参要加
--:npm run build -- --mode=prod。
常见问题(FAQ)
Q:怎么传环境变量而不是参数?
NODE_ENV=production node app.js,代码里读 process.env.NODE_ENV。敏感配置用环境变量比命令行参数安全(参数在 ps 里可见)。
Q:参数里带中文乱码?
终端编码问题。Linux/macOS 默认 UTF-8 无问题;Windows cmd 建议先 chcp 65001。
Q:process.argv 能改吗?
能改但别改——它是进程启动参数的原始记录,框架和调试工具依赖它。