开发手册 欢迎您!
软件开发者资料库

逐行读取 | Node.js

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm,是全球最大的开源库生态系统。

Node.js v8.x 中文文档


readline (逐行读取)#

稳定性: 2 - 稳定的

require('readline') 模块提供了一个接口,用于从可读流(如 process.stdin)读取数据,每次读取一行。它可以通过以下方式使用:

const readline = require('readline');

例子,readline 模块的基本用法:

const readline = require('readline');const rl = readline.createInterface({  input: process.stdin,  output: process.stdout});rl.question('你认为 Node.js 中文网怎么样?', (answer) => {  // 对答案进行处理  console.log(`多谢你的反馈:${answer}`);  rl.close();});

注意:当调用该代码时,Node.js 程序不会终止,直到 readline.Interface 被关闭,因为接口在等待 input 流中要被接收的数据。

Interface 类#

readline.Interface 类的实例是使用 readline.createInterface() 方法构造的。每个实例都关联一个 input 可读流和一个 output 可写流output 流用于为到达的用户输入打印提示,且从 input 流读取。

'close' 事件#

当以下之一发生时,触发 'close' 事件:

  • rl.close() 方法被调用,且 readline.Interface 实例已撤回对 input 流和 output 流的控制;
  • input 流接收到 'end' 事件;
  • input 流接收到表示结束传输的 -D
  • input 流接收到表示 SIGINT-C,且 readline.Interface 实例上没有注册 SIGINT 事件监听器。

监听器函数被调用时不传入任何参数。

'close' 事件被触发时,readline.Interface 实例会被结束。

'line' 事件#

每当 input 流接收到接收行结束符(\n\r\r\n)时触发 'line' 事件。通常发生在用户按下 键或 键。

监听器函数被调用时会带上一个包含接收的那一行输入的字符串。

例子:

rl.on('line', (input) => {  console.log(`接收到:${input}`);});

'pause' 事件#

当以下之一发生时触发 'pause' 事件:

  • input 流被暂停。
  • input 流不是暂停的,且接收到 SIGCONT 事件。(详见 SIGTSTP 事件和 SIGCONT 事件)

监听器函数被调用时不传入任何参数。

例子:

rl.on('pause', () => {  console.log('Readline 被暂停。');});

'resume' 事件#

每当 input 流被恢复时触发 'resume' 事件。

监听器函数被调用时不传入任何参数。

例子:

rl.on('resume', () => {  console.log('Readline 被恢复。');});

'SIGCONT' 事件#

当一个 Node.js 进程使用 -Z(也就是 SIGTSTP)移入后台之后再使用 fg(1p) 移回前台时,触发 'SIGCONT' 事件。

如果 input 流在 SIGTSTP 请求之前被暂停,则事件不会被触发。

监听器函数被调用时不传入任何参数。

例子:

rl.on('SIGCONT', () => {  // `prompt` 会自动恢复流  rl.prompt();});

注意:Windows 系统不支持 'SIGCONT' 事件。

'SIGINT' 事件#

每当 input 流接收到一个 -C 输入(通常被称为 SIGINT)时,触发 'SIGINT' 事件。当 input 流接收到一个 SIGINT 时,如果没有注册 'SIGINT' 事件监听器,则 'pause' 事件会被触发。

监听器函数被调用时不传入任何参数。

例子:

rl.on('SIGINT', () => {  rl.question('确定要退出吗? ', (answer) => {    if (answer.match(/^y(es)?$/i)) rl.pause();  });});

'SIGTSTP' 事件#

每当 input 流接收到一个 -Z 输入(通常被称为 SIGTSTP)时,触发 'SIGTSTP' 事件。当 input 流接收到一个 SIGTSTP 时,如果没有注册 'SIGTSTP' 事件监听器,则 Node.js 进程会被发送到后台。

当程序使用 fg(1p) 恢复时,'pause'SIGCONT 事件会被触发。这可被用来恢复 input 流。

如果 input 流在进程被发送到后台之前被暂停,则 'pause'SIGCONT 事件不会被触发。

监听器函数被调用时不传入任何参数。

例子:

rl.on('SIGTSTP', () => {  // 这会重写 SIGTSTP,且防止程序进入后台。  console.log('捕获 SIGTSTP。');});

注意:Windows 系统不支持 'SIGTSTP' 事件。

rl.close()#

rl.close() 方法会关闭 readline.Interface 实例,且撤回对 inputoutput 流的控制。但被调用时,'close' 事件会被触发。

rl.pause()#

rl.pause() 方法会暂停 input 流,且稍后需要时可被恢复。

调用 rl.pause() 不会立刻暂停其他事件(包括 'line')被 readline.Interface 实例触发。

rl.prompt([preserveCursor])#

  • preserveCursor 如果为 true,则阻止光标落点被设为 0

rl.prompt() 方法会在 output 流中新的一行写入 readline.Interface 实例配置后的 prompt,用于为用户提供一个可供输入的新的位置。

当被调用时,如果 input 流已被暂停,则 rl.prompt() 会恢复 input 流。

如果 readline.Interface 被创建时 output 被设为 nullundefined,则提示不会被写入。

rl.question(query, callback)#

  • query 一个在提示符之前、要写入 output 的叙述或询问。
  • callback 一个回调函数,它会被调用并带上用户响应 query 的输入。

rl.question() 方法通过写入到 output 来展示 query,并等待用户提供到 input 的输入,然后调用 callback 函数并传入提供的输入作为第一个参数。

当被调用时,如果 input 流已被暂停,则 rl.question() 会恢复 input 流。

如果 readline.Interface 被创建时 output 被设为 nullundefined,则 query 不会被写入。

例子:

rl.question('你最喜欢的食物是什么? ', (answer) => {  console.log(`你最喜欢的食物是 ${answer}`);});

注意:传入的 rl.question()callback 函数不遵循接受一个 Error 对象或 null 作为第一个参数的标准模式。callback 被调用时只带上提供的答案作为唯一的参数。

rl.resume()#

如果 input 流已被暂停,则 rl.resume() 方法会恢复 input 流。

rl.setPrompt(prompt)#

  • prompt

rl.setPrompt() 方法用于设置每当 rl.prompt() 被调用时要被写入到 output 的提示。

rl.write(data[, key])#