Jacleklm's Blog

用 node.js 开发一个可交互的命令行应用

2020/11/03

原生 node

  • 用 process.argv 直接读取
  • process.stdin.on 劫持输入
  • readline 模块 进行逐行读取。该模块提供了一个接口,用于一次一行地读取可读流(例如 process.stdin)中的数据
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    const app = require('./app')
    const readline = require('readline');
    const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
    });

    rl.question('请输入当前的年份和月份,然后按回车键。eg: 202010. ', (month) => {
    rl.question('请输入本月小结会的月份和日期,然后按回车键。eg: 1130. ', (date) => {
    console.log('数据统计中, 请勿触碰键盘...');
    app(month, date);

    // 一旦调用此代码,Node.js 应用程序将不会终止,直到 readline.Interface 关闭( rl.close() ),因为接口在 input 流上等待接收数据
    // rl.close();

    rl.on('close', () => { // close事件,ctrl + C 也会触发。详见 http://nodejs.cn/api/readline.html
    console.log("Goodbye 👋");
    // exit the process
    process.exit(0);
    });

    })

借助 prompt 包

如果你 打算在Node.js中构建可靠的CLI工具,则 prompt 可能是一个很好的选择。比readline更好用。
能像处理页面表单一样处理命令行输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const prompt = require('prompt');

// start the prompt
prompt.start();
// define properties schemavar schema = {
properties: {
name: {
pattern: /^[a-zA-Z\s\-]+$/,
message: 'Name must be only letters, spaces, or dashes',
required: true
},
password: {
hidden: true // 这里能隐藏密码
}
}};

// ask user for the input
prompt.get(schema, (err, result) => {
if (err) {
throw err;
}
// print user credentials
console.log(`${result.name} / ${result.password}`);
});

借助 Commander 包
这个感觉更像是封装命令行命令了,不仅仅是初始化时读取输入
代码:

1
2
3
4
5
6
var program = require('commander');
program
.version('0.0.1') // node index --version 或 node index -V 能打印出我们定义的版本号。相当于 -V 和 -h 是自带的,其他的可以通过 .option() 来自定义
.option('-l, --list [list]', 'list of customers in CSV file') // 自定义的
.parse(process.argv)
console.log(program.list);

执行:

1
2
3
4
5
6
7
8
9
> node index --version 或 node index -V 能打印出我们定义的版本号
0.0.1

> node index --help
Usage: index [options]
Options:
-V, --version output the version number
-l, --list [list] list of customers in CSV file
-h, --help display help for command

参考资料
如何从Node.js中的命令行读取输入
用 node.js 开发一个可交互的命令行应用: commander

CATALOG
  1. 1. 原生 node
  2. 2. 借助 prompt 包