NodeJs-Readline

 后端   小卒子   2024-09-08 13:21   108
  nodejs

Node.js 中的 readline 模块用于逐行地读取可读流(如用户的输入)并进行交互。它常用于 CLI(命令行接口)应用程序。这个模块允许程序通过命令行与用户进行交互,输入输出文本数据。

readline 的主要功能包括创建交互式命令行界面、逐行处理输入以及执行复杂的 I/O 操作。它通过 ReadableWritable 流来处理输入输出。

1. Readline 模块概述

readline 模块提供了一个接口,可以让程序通过 stdinstdout 与用户进行交互。通过 readline 模块,程序可以读取用户输入的每一行并根据输入的内容执行不同的操作。这对于命令行工具和其他需要用户交互的应用程序非常有用。

readline 可以与 ReadableWritable 流结合使用,允许程序读取文件、终端输入等。

2. Readline 的属性与方法

2.1 readline.createInterface()

readline.createInterface() 是创建 readline 接口的核心方法,它允许你设置输入和输出流,并根据用户输入处理交互。

语法:

const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,    // 输入流
  output: process.stdout,  // 输出流
  terminal: true           // 是否启用终端功能
});
  • input: 指定输入流(如 process.stdin)。
  • output: 指定输出流(如 process.stdout)。
  • terminal: 可选参数,布尔值,表示是否使用 ANSI 终端序列。默认为 true
  • completer: 可选参数,函数,用于自动补全输入。
  • historySize: 可选参数,指定历史记录的长度。

示例:

const readline = require('readline');

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

2.2 rl.question()

rl.question() 用于向用户展示提示并获取用户的输入。这个方法会暂停执行代码,直到用户输入并按下回车。

语法:

rl.question(query, callback);
  • query: 询问用户的问题(即显示的提示)。
  • callback: 回调函数,在用户输入完后执行,回调参数为用户的输入内容。

示例:

rl.question('你叫什么名字?', (answer) => {
  console.log(`你好,${answer}!`);
  rl.close();  // 完成后关闭接口
});

这个代码会提示用户输入名字,然后根据输入内容进行回应。

2.3 rl.prompt()

rl.prompt() 用于在控制台上显示提示符,等待用户输入。常用于创建命令行界面。

语法:

rl.prompt();
  • 它不会阻塞程序运行,而是显示一个提示符,等待用户输入。

示例:

rl.setPrompt('输入命令> ');
rl.prompt();

rl.on('line', (input) => {
  console.log(`你输入的命令是: ${input}`);
  rl.prompt();
});

2.4 rl.write()

rl.write() 用于向用户输入流写入数据。可以将一些提示或默认输入值写入输入缓冲区。

语法:

rl.write(data[, key]);
  • data: 要写入的字符串。
  • key: 可选的键序列,用于模拟键盘按键事件。

示例:

rl.write('你好,请输入你的名字: ');

你可以模拟某些按键行为,如回车:

rl.write(null, { ctrl: true, name: 'u' });  // 模拟 Ctrl + U 清除行

2.5 rl.close()

rl.close() 用于关闭 readline 接口,结束程序与用户的交互。

语法:

rl.close();

示例:

rl.question('你喜欢编程吗?', (answer) => {
  console.log(`你回答了: ${answer}`);
  rl.close();
});

close() 结束 readline 接口,同时也会关闭输入流并终止进一步的用户输入。

2.6 rl.on()

rl.on() 是用于监听 readline 实例中的事件,如 lineclose 等。

常用的事件有:

  • line: 用户每次按下回车并提交输入时触发。
  • close: readline 接口关闭时触发。
  • SIGINT: 用户按下 Ctrl+C 时触发。

语法:

rl.on(eventName, listener);
  • eventName: 事件名称,如 'line''close' 等。
  • listener: 事件触发时调用的回调函数。

示例:

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

rl.on('close', () => {
  console.log('再见!');
  process.exit(0);
});
  • line: 用户输入并按下回车时触发,input 为用户输入的字符串。
  • close: 当 rl.close() 被调用时触发,用于在结束交互后进行收尾操作。

3. Readline 使用示例

下面是一个更完整的使用 readline 的示例程序,它实现了一个简单的交互式命令行工具,用户可以输入问题,程序会根据输入执行不同的操作:

const readline = require('readline');

// 创建 readline 接口
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  prompt: '请输入命令> '
});

// 显示提示符
rl.prompt();

// 监听每一行输入
rl.on('line', (input) => {
  switch (input.trim()) {
    case 'hello':
      console.log('你好!');
      break;
    case 'exit':
      console.log('再见!');
      rl.close();
      break;
    default:
      console.log(`你输入了: ${input}`);
      break;
  }
  rl.prompt();  // 继续提示输入
});

// 当接口关闭时触发
rl.on('close', () => {
  console.log('程序结束');
  process.exit(0);
});

在这个例子中,用户可以在命令行中输入内容,程序会响应特定的命令(如输入 hello 会输出 "你好",输入 exit 会退出程序)。

4. 总结

readline 模块为 Node.js 提供了交互式命令行界面的支持。通过这个模块,你可以轻松地处理用户输入、显示提示符并处理复杂的命令行交互。它是开发命令行工具、脚本和应用程序时非常实用的工具。

如果你希望处理更高级的 I/O 操作(如多行输入、自动补全等),可以结合 readline 模块的高级功能,或者使用第三方库如 inquirer.jscommander.js 来简化命令行应用的开发。