如何给 Node.js 程序传递并读取命令行参数?

Node.js 命令行参数通过 process.argv 数组读取:argv[0] 是 node 路径,argv[1] 是脚本路径,argv[2] 起才是你的参数。带选项的参数解析推荐 minimist 或 util.parseArgs。本文给出完整写法。

最佳实践
Node.js 事件循环与异步任务示意

参数都在 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 能改吗?
能改但别改——它是进程启动参数的原始记录,框架和调试工具依赖它。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台