资讯专栏INFORMATION COLUMN

node.js之readline模块的使用

AlanKeene / 438人阅读

摘要:控制台结果显示请输入当使用创建实例时,,如果输入流为或者,则写入数据到输出流。恢复输入流事件调用方法时会触发该事件,或者输入流接收到结束事件。关闭输入流退出当前进程该事件在系统上不起作用当使用将进程移动到后台时,事件将会被触发。

什么是readline

readline允许从可读流中以逐行的方式读取数据,比如process.stdin等。
在node.js命令行模式下默认引入了readline模块,但如果是使用node.js运行脚本的话,则需要自己通过require("readline")方式手动引入该模块。

怎么使用readline 创建实例

  首先、创建一个接口实例,提供一个Object类型的参数。参数如下:
input: 监听的可读流(必需)
output: 写入readline的可写流(必需)
completer: 用于 Tab 自动补全的可选函数(不常用)
terminal: 如果希望 input 和 output 流像 TTY 一样对待,那么传递参数 true ,并且经由 ANSI/VT100 转码。 默认情况下检查 isTTY 是否在 output 流上实例化。(不常用)
historySize: 保留行历史纪录最大值,为了禁用该值被设置为0,默认为30,只有在terminal被设置为true或通过一个内部输出检查时,这个选项才有作用,否则历史缓存机制不会初始化。(不常用)

第一种方式:只传入两个必传参数
  const readLine = require("readline");
  let rl = readLine.createInterface(process.stdin, process.stdout);
第二种方式:可以传入其他非必需参数
  const readLine = require("readline");
  let rl = readLine.createInterface({
    input: process.stdin,
    output: process.stdout,
    // 其他参数省略
  })
实例
  const readLine = require("readline");
  let rl = readLine.createInterface({
    input: process.stdin,
    output: process.stdout,
    prompt: "> 请输入"
  })
  // 调用
  rl.prompt(); // 控制台结果显示:>请输入

注意:一旦该代码被调用,Node.js程序将不会终止知道readline接口被关闭,因为接口会在输入流中不停的等待数据。

方法

以下所有的实例均依据如下rl所创建:

  const readLine = require("readline");
  let rl = readLine.createInterface({
    input: process.stdin,
    output: process.stdout
  })
1、rl.setPrompt([prompt])

  设置提示符,当你使用node运行该文件,并且调用rl.prompt()时,会在终端看到你设置的提示prompt,即“> 请输入”

  rl.setPrompt("> 请输入")

注意:该方法和上面的实例参数配置是一样的效果

2、rl.prompt([preserveCursor])

  为用户输入准备好readline,将现有的setPrompt选项放到新的一行,让用户有一个新的地方开始输入。将preserveCursor设为true来防止光标位置被重新设定成0。
  如需要换行输入,即在新的一行,输入信息,可在prompt中加入n。

  rl.prompt(); // 控制台结果显示:>请输入
3、rl.write(data[, key])

  当使用readline.createInterface()创建实例时,,如果输入流为null或者undefined,则写入数据到输出流。
  key是一个表示键序列的字面量对象,如果终端是TTY,则可用。

  rl.write("Delete me!");
  // Simulate ctrl+u to delete the line written previously
  rl.write(null, {ctrl: true, name: "u"});
4、rl.question(query, callback)

  预先制定提示内容query,将会在用户输入被应答后,触发执行指定的回掉函数callback。

  rl.question("你今年多大了?
", function(prompt) {
    console.log("这是你输入的回答结果:" + prompt);
    rl.close();
  })
5、rl.pause()

  暂停readline的输入流,可以恢复,rl.resume()、rl.write()、rl.question()和rl.prompt()均可以恢复该输入流。
  调用该方法会触发pause事件。

6、rl.resume()

  恢复readline的输入流。
  调用该方法会触发resume事件。

7、rl.close()

  关闭readline创建的实例,不控制输入输出流。
  调用该方法会触发close事件。

事件
1、line事件

  无论何时,在输入流接收了一个行结束符(n, r, 或者 rn)时触发,即在用户输入后,按了回车或者返回键时触发该事件。可以用来监听用户输入。

  rl.on("line", function (line) {
    console.log("这是用户输入的内容:" + line);
  })
2、pause事件

  输入流被暂停时触发,即调用了rl.pause(),或者没有暂停输入流,在收到 SIGCONT/SIGINT,且readline.Interfacce实例上并没有注册SIGCONT/SIGINT监听器时,也会被触发,并且如果输入流在收到SIGTSIP之前就已经被暂停了,那么该事件也不会触发。

  rl.on("pause", function() {
    console.log("暂停输入流...")
  })
3、resume事件

  输入流重新启动时被触发,即调用了rl.resume()、或者rl.write()、rl.question()和rl.prompt()。

  rl.on("resume", function() {
    console.log("恢复输入流...")
  })
4、close事件

  调用rl.close()方法时会触发该事件,或者输入流接收到“结束”事件。以下的任意一种情况都会触发close事件。
一旦close事件被触发,则认为readline.Interaface实例已经终止。
1)、rl.close()方法被调用后,readline.Interaface实例便会放弃输入输出流的控制权。
2)、输入流接收到自己的“end”事件。
3)、输入流接收到-C,发送SIGINT信号,并且在readline.Interfacce实例上并没有注册SIGINT事件的监听器。
4)、输入流接收到-D,发送传输结束信号(EOF,end-of-transmission);
5)、EOT:定界符,即输入单个或多个“>”,并按下回车时。

  rl.on("close", function() {
    console.log("关闭输入流...");
    process.exit(0); // 退出当前进程
  })
5、SIGCOUT(该事件在window系统上不起作用)

  当使用-Z将Node.js进程移动到后台时,SIGCONT事件将会被触发。然后可以使用 fg(1) 命令将它移动到前台。
  如果输入流在收到SIGTSIP之前就已经被暂停了,那么该事件就不会触发。

6、SIGINT

  当输入流收到-C命令时,我们熟知的SIGINT事件就会被触发。如果当时并没有注册任何SIGINT事件监听器,那么当输入流接收到SIGINT信号时,’pause’事件和’close’事件均会被触发。

7、SIGTSTP(该事件在window系统上不起作用)

  当输入流收到-Z命令时,我们熟知的SIGTSTP事件就会被触发。如果没有注册SIGTSTP事件监听器,那么当输入流收到SIGTSTP事件时,Node.js进程就将会被移动到后台。
  如果输入在进程被发送到后台之前就已经被暂停了,那么’pause’和’SIGCONT’事件就将不会被触发。

参见官方文档
参考案例看笑话

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/95416.html

相关文章

  • Node.js学习路20——readline模块与util模块

    摘要:使用模块逐行读取流数据创建对象在模块中,通过对象的使用来实现逐行读取流数据的处理。属性值为一个可用来写入流数据的对象,用于指定数据的输出目标。属性值为一个函数,用于指定补全处理。 1. 使用readline模块逐行读取流数据 1.1. 创建Interface对象 在readline模块中,通过Interface对象的使用来实现逐行读取流数据的处理。因此首先要创建Interface对象,...

    XFLY 评论0 收藏0
  • Node命令行工具开发【看段子小工具】

    摘要:我们的小项目就初始化成功了,就可以认真思考代码了首先分析糗事百科我们打开糗事百科会发现它的还是很简单,由于我们只是爬取段子所以如下,就是页数。 Node命令行工具开发【看段子】 你有没有上班想看笑话却又怕领导发现的经历?现在我们就用几十行代码写一个命令行看笑话段子的小程序,从此无需担心领导的视察。这篇文章和上一篇差不多都是命令行小工具开发,不过本篇更偏向于小爬虫的开发 总览:命令行看段...

    kelvinlee 评论0 收藏0
  • JavaScript机器学习线性回归

    摘要:不能用于机器学习太慢幻觉矩阵操作太难有函数库啊,比如只能用于前端开发开发者笑了机器学习库都是开发者机器学习库神经网络神经网络自然语言处理卷积神经网络一系列库神经网络深度学习我们将使用来实现线性回归,源代码在仓库。 译者按: AI时代,不会机器学习的JavaScript开发者不是好的前端工程师。 原文: Machine Learning with JavaScript : Part 1 ...

    gitmilk 评论0 收藏0
  • JavaScript机器学习线性回归

    摘要:不能用于机器学习太慢幻觉矩阵操作太难有函数库啊,比如只能用于前端开发开发者笑了机器学习库都是开发者机器学习库神经网络神经网络自然语言处理卷积神经网络一系列库神经网络深度学习我们将使用来实现线性回归,源代码在仓库。 译者按: AI时代,不会机器学习的JavaScript开发者不是好的前端工程师。 原文: Machine Learning with JavaScript : Part 1 ...

    qc1iu 评论0 收藏0
  • node.js做编程题

    摘要:用写编程题的核心在的接口,读取输入行,模块提供了一个接口,用于从可读流如读取数据,每次读取一行。五总结通过以上这种方式,应该能完成大部分的在线编程题,有需要的童鞋可以试试看。 一.js的控制台输入做各大公司的在线编程题,一般都有输入输出,传统的js不能完成读取输入的功能,这时候为了继续用js写编程题,只能借助node.js来进行在线笔试的输入输出,下面具体来说说这个问题。 用node....

    Zoom 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<