Node.js
中的 readline
模块用于逐行地读取可读流(如用户的输入)并进行交互。它常用于 CLI(命令行接口)应用程序。这个模块允许程序通过命令行与用户进行交互,输入输出文本数据。
readline
的主要功能包括创建交互式命令行界面、逐行处理输入以及执行复杂的 I/O 操作。它通过 Readable
和 Writable
流来处理输入输出。
1. Readline 模块概述
readline
模块提供了一个接口,可以让程序通过 stdin
和 stdout
与用户进行交互。通过 readline
模块,程序可以读取用户输入的每一行并根据输入的内容执行不同的操作。这对于命令行工具和其他需要用户交互的应用程序非常有用。
readline
可以与 Readable
和 Writable
流结合使用,允许程序读取文件、终端输入等。
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
实例中的事件,如 line
、close
等。
常用的事件有:
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.js
或 commander.js
来简化命令行应用的开发。