如何使用内置的readline Node模块使Node.js CLI程序具有交互性

如何使Node.js CLI程序具有交互性?

Node自版本7开始提供了readline模块,可以实现从可读流(比如process.stdin流,它在Node程序执行期间是终端输入)逐行获取输入。

const readline = require('readline').createInterface({
 input: process.stdin,
 output: process.stdout
})

readline.question(`What's your name?`, (name) => {
 console.log(`Hi ${name}!`)
 readline.close()
})

这段代码会询问用户名,一旦文本被输入,并且用户按下回车键,我们会发送一条问候语。

question()方法会展示第一个参数(一个问题),并且等待用户输入。一旦按下回车键,它会调用回调函数。

在这个回调函数中,我们关闭了readline接口。

readline还提供了其他几个方法,我会让你自己在我上面提供的包文档中去查阅。

如果你需要输入密码,最好不要将其回显,而是显示为*符号。

最简单的方法是使用readline-sync,它在API方面与上述方法非常相似,并且直接处理了这个问题。

一个更完整和抽象的解决方案则是由Inquirer.js包提供。

你可以使用npm install inquirer进行安装,然后你可以像这样重现上面的代码:

const inquirer = require('inquirer')

var questions = [{
 type: 'input',
 name: 'name',
 message: "What's your name?",
}]

inquirer.prompt(questions).then(answers => {
 console.log(`Hi ${answers['name']}!`)
})

Inquirer.js可以让你做很多事情,比如提问多个选择、使用单选按钮、确认等等。

值得知道所有的选择,尤其是Node提供的内置选择,但如果你计划将CLI输入推向一个新的层次,Inquirer.js是一个优秀的选择。