在 Node.js 中从命令行接收输入

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

从版本 7 开始,Node.js 提供了 readline 模块来执行以下操作:每次一行地从可读流(例如 process.stdin 流,在 Node.js 程序执行期间该流就是终端输入)获取输入。

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

readline.question(`你叫什么名字?`, name => {
  console.log(`你好 ${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: "你叫什么名字?"
  }
]

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

Inquirer.js 可以执行许多操作,例如询问多项选择、展示单选按钮、确认等。

所有的可选方案都值得了解,尤其是 Node.js 提供的内置方案,但是如果打算将 CLI 输入提升到更高的水平,则 Inquirer.js 是更优的选择。