Node的readline (逐行读取)

    先来看这个基本示例:

    在命令行中执行node hello.js将出现如下结果:

    1. $ node hello.js
    2. 你叫什么名字?liu
    3. 早上好,liu

    通过这个示例,我们可以发现readline模块可以方便的实现命令行的交互功能。实现如治疗的小应用

    下面我们先来了解readline的基本用法,然后再实现一个有趣的小功能。

    创建一个readline的接口实例. 接受一个Object类型参数,可传递以下几个值:

    • input - 要监听的可读流 (必需)
    • output - 要写入 readline 的可写流 (必须).
    • completer - 用于 Tab 自动补全的可选函数。(不常用)
    • terminal - 如果希望 input 和 output 流像 TTY 一样对待,那么传递参数 true ,并且经由 ANSI/VT100 转码。 默认情况下检查 isTTY 是否在 output 流上实例化。(不常用)
    • rl.close() 关闭接口实例 (Interface instance), 放弃控制输入输出流。”close” 事件会被触发
    • rl.pause()暂停 readline 的输入流 (input stream), 如果有需要稍后还可以恢复。
    • 预先提示指定的query,然后用户应答后触发指定的callback。 显示指定的query给用户后,当用户的应答被输入后,就触发了指定的callback
    • rl.resume()恢复 readline 的输入流 (input stream).
    • rl.setPrompt(prompt) 用于设置每当 rl.prompt() 被调用时要被写入到 output 的提示。
    • rl.write(data[, key])data 或一个由 key 指定的按键序列写入到 output
    • line事件 :在 input 流接受了一个\n 时触发,通常在用户敲击回车或者返回时接收。 这是一个监听用户输入的利器。
    • pause事件: 输入流被暂停就会触发。 同样当输入流未被暂停,但收到 SIGCONT 也会触发。 (详见 SIGTSTP 和 SIGCONT 事件)
    • resume事件:只要输入流重新启用就会触发
    • close事件:当 close() 被调用时触发。 当 input流接收到end事件时也会被触发. 流接收到表示结束传输的 <ctrl>-D,收到表示 SIGINT 的 <ctrl>-C,且 readline.Interface 实例上没有注册 SIGINT 事件监听器。

    更多请参考node中文网

    现在我们来实现一个命令行可交互的百度搜索

    1.使用readline实现一个可交互的命令行

    1. // 先来实现一个可交互命令行
    2. const rl = readline.createInterface({
    3. input: process.stdin,
    4. output: process.stdout,
    5. })
    6. rl.prompt()
    7. rl.on('line', (line) => {
    8. rl.prompt()
    9. }).on('close', () => {
    10. console.log('再见!')
    11. process.exit(0)
    12. })

    node index.js运行这段代码出现可交互的命令行,等待我们输入,输入完成回车后会打印出输入的值

    2.使用http模块发起请求

    这里为了加深对原生http模块的理解我们没用第三方模块,有很多好用的第三方模块如:、superagent

    这里我们用到了具体使用可参考其官网

    3. 实现命令行搜索

    到此,我们只需将命令行的代码与http请求的代码整合起来就可以完成这个小项目了

    1. ...
    2. rl.on('line', (line) => {
    3. search(line.trim(), ()=>{
    4. rl.prompt()
    5. })
    6. }).on('close', () => {
    7. console.log('再见!')
    8. process.exit(0)
    9. ...

    源码地址: github

    现在在快命令行中试试我们一起完成的这个小案例吧!!!

    现在我们已经基本完成了命令行百度搜索这个小案例,我们还可为他加入更多的功能.。如,我们可以把它开发为全局命令行工具,只需要一个命令便可调用。如果有兴趣可以参考、node命令行小工具开发【翻译小工具】,建议大家都去试一试,实现更多有趣的功能

    相关链接