NodeJS 命令行(cli)读入参数和多行读入

需求描述

有时候我们起一个 node 的程序, 需要用户在启动前输入一些参数,比如用户名密码之类的啦,然后再继续启动程序。这是怎么做到的呢?其实就是用到了 nodejs 的 readline 模块。

代码

// 这里是你的主程序逻辑, 已经获得了输入的参数
function yourFunction(username: string | undefined, password: string | undefined) {
  console.log(username);
  console.log(password);
}

function main() {
  // 引入readline模块
  const readLine = require('readline');
  const rl = readLine.createInterface({
    input: process.stdin,
    output: process.stdout
  });

  // 先让用户输入用户名
  let username: string | undefined;
  const getUsername = () => {
    return new Promise((resolve, reject) => {
      rl.question('Please input the auth username(default is empty) :', (answer: string) => {
        username = answer;
        resolve();
      })
    })
  }

  // 再让用户输入密码
  let password: string | undefined;
  const getPassword = () => {
    return new Promise((resolve, reject) => {
      rl.question('Please input the auth password(default is empty) :', (answer: string) => {
        password = answer;
        resolve();
      })
    })
  }

  // 定义一个同步的方法, 等待用户输入 
  const go = async () => {
    await getUsername();
    await getPassword();
    //用户输入完参数后,再继续执行下面的逻辑方法 3
    yourFunction(username, password);
    // 记得关流
    rl.close();
  }

  // 开始执行同步方法 2
  go();
}

// 程序从这里开始 1
main()

CLI 方式传入参数

如果想用 cli 的方式传入参数, 为了方便类似 docker 的启动方式, 那我们就需要用到 node 的 process.argv 了。

process 是 node 自带的变量, 它的 argv 是一个数组, 存放了启动 node 时传入的参数变量。

比如我们有一个 main.js, 在 pacakge.json 中配置了 start 脚本为 node main.js。

那么我们在 main.js 中就能直接用 process.argv 拿到入参了, 比如

npm start useAuth=true useHttps=yes port=8081

这时候 main.js 中打印 process.argv 

console.log(process.argv);
// ['node', 'src/resouces/js/main.js', 'useAuth=true', 'useHttps=yes', 'port=8081']
// 可以直接用 slice 来去掉 node 前缀
console.log(process.argv.slice(2));
// ['useAuth=true', 'useHttps=yes', 'port=8081']

这是如果你想用类似 flag 的方法传参, 你可能会发现丢失了 -开头的参数, 比如

npm start --useAuth true --useHttps yes --port 8081
// main.js 中打印 process.argv
console.log(process.argv.slice(2))
// ['true', 'yes', '8081']

所有的 -开头的参数被吃掉了, 怎么办呢?

这时候加入 — 开头 enable cli 的 flag 传参就好了

npm start -- --useAuth true --useHttps yes --port 8081
// main.js 中打印 process.argv
console.log(process.argv.slice(2))
// ['--useAuth', 'true', '--useHttps', 'yes', '--port', '8081']

注意 npm start 后面多了一个 ‘–’

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Scroll to Top