Node.js readline 模块
Node.js 的 readline
模块是一个用于从可读流(如 process.stdin
)逐行读取数据的接口。它提供了一种简单的方式来处理命令行输入,非常适合创建交互式命令行应用程序。
基本使用方法
引入 readline 模块
要使用 readline
模块,首先需要引入它:
const readline = require('readline');
创建 readline 接口
创建 readline.Interface
实例是使用该模块的核心:
实例
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
input: process.stdin,
output: process.stdout
});
这里我们创建了一个接口,它将从标准输入(键盘)读取数据,并将输出写入标准输出(控制台)。
主要方法和事件
逐行读取输入
使用 question()
方法可以向用户提问并等待回答:
实例
rl.question('你叫什么名字?', (answer) => {
console.log(`你好,${answer}!`);
rl.close();
});
console.log(`你好,${answer}!`);
rl.close();
});
监听 line 事件
当用户输入一行内容并按下回车时,会触发 line
事件:
实例
rl.on('line', (input) => {
console.log(`收到:${input}`);
if (input === 'exit') {
rl.close();
}
});
console.log(`收到:${input}`);
if (input === 'exit') {
rl.close();
}
});
关闭接口
使用 close()
方法关闭接口并释放资源:
实例
rl.close();
当接口关闭时,会触发 close
事件:
实例
rl.on('close', () => {
console.log('再见!');
process.exit(0);
});
console.log('再见!');
process.exit(0);
});
高级功能
历史记录
readline
模块支持命令历史记录功能:
实例
rl.history = ['命令1', '命令2']; // 设置历史记录
用户可以使用上下箭头键浏览历史命令。
自定义补全
可以实现自定义的 Tab 补全功能:
实例
rl.on('completer', (line) => {
const completions = ['help', 'exit', 'show'];
const hits = completions.filter((c) => c.startsWith(line));
return [hits.length ? hits : completions, line];
});
const completions = ['help', 'exit', 'show'];
const hits = completions.filter((c) => c.startsWith(line));
return [hits.length ? hits : completions, line];
});
光标控制
readline
提供了一些方法来控制光标:
实例
readline.cursorTo(process.stdout, 10, 5); // 移动光标到第10列第5行
readline.clearLine(process.stdout, 0); // 清除当前行
readline.clearScreenDown(process.stdout); // 清除光标以下的内容
readline.clearLine(process.stdout, 0); // 清除当前行
readline.clearScreenDown(process.stdout); // 清除光标以下的内容
实际应用示例
创建一个简单的命令行问答程序
实例
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
const questions = [
'你叫什么名字?',
'你今年多大了?',
'你最喜欢的编程语言是什么?'
];
const answers = [];
function askQuestion(i = 0) {
if (i >= questions.length) {
console.log('谢谢你的回答:', answers);
return rl.close();
}
rl.question(questions[i], (answer) => {
answers.push(answer);
askQuestion(i + 1);
});
}
askQuestion();
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
const questions = [
'你叫什么名字?',
'你今年多大了?',
'你最喜欢的编程语言是什么?'
];
const answers = [];
function askQuestion(i = 0) {
if (i >= questions.length) {
console.log('谢谢你的回答:', answers);
return rl.close();
}
rl.question(questions[i], (answer) => {
answers.push(answer);
askQuestion(i + 1);
});
}
askQuestion();
创建一个简单的命令行计算器
实例
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
function calculator() {
rl.question('请输入表达式 (例如: 2 + 3 或输入 exit 退出): ', (input) => {
if (input === 'exit') {
return rl.close();
}
try {
const result = eval(input); // 注意:实际应用中应避免直接使用eval
console.log(`结果: ${result}`);
} catch (e) {
console.log('无效的表达式');
}
calculator(); // 递归调用继续下一次计算
});
}
calculator();
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
function calculator() {
rl.question('请输入表达式 (例如: 2 + 3 或输入 exit 退出): ', (input) => {
if (input === 'exit') {
return rl.close();
}
try {
const result = eval(input); // 注意:实际应用中应避免直接使用eval
console.log(`结果: ${result}`);
} catch (e) {
console.log('无效的表达式');
}
calculator(); // 递归调用继续下一次计算
});
}
calculator();
安全注意事项
避免使用 eval():上面的计算器示例使用了
eval()
,这在生产环境中是不安全的,因为它会执行任何输入的JavaScript代码。实际应用中应该使用专门的表达式解析器。输入验证:始终验证用户输入,防止注入攻击或其他安全问题。
错误处理:为所有异步操作添加适当的错误处理。
总结
Node.js 的 readline
模块是构建交互式命令行工具的强大工具。通过它,我们可以:
- 轻松获取用户输入
- 创建问答式交互界面
- 实现命令历史记录
- 添加Tab补全功能
- 控制终端光标和输出
掌握 readline
模块是开发Node.js命令行工具的重要一步,希望本文能帮助你理解和使用这个模块。
点我分享笔记