需求描述
有时候我们起一个 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 后面多了一个 ‘–’