在 Node.js 中,readline 模块提供了一种逐行读取数据流的方法。它允许你从一个可读流(如 process.stdin)中读取用户输入,并且可以对用户的输入进行处理。
readline 模块提供了几个核心类,包括 Interface 和 Readline,它们可以用于读取和处理用户输入。使用 readline 模块,你可以编写交互式的命令行工具,如命令行脚本或控制台应用程序。
readline模块提供了一个接口,用于从可读流中读取数据,例如从标准输入读取用户输入。
readline模块的基本方法:
首先,需要使用require语句引入readline模块:
const readline = require('readline');
创建一个readline.Interface对象。此对象接收一个输入流和一个输出流作为参数:
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
使用rl.question()方法从输入流中读取数据。该方法接受两个参数:一个提示字符串和一个回调函数。在回调函数中可以使用读取到的数据进行后续处理:
rl.question('请输入一个字符串:', (answer) => {
console.log(`你输入的是:${answer}`);
rl.close();
});
当读取完成后,需要使用rl.close()方法关闭readline.Interface对象。
完整的示例代码如下:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('请输入一个字符串:', (answer) => {
console.log(`你输入的是:${answer}`);
rl.close();
});
使用promise封装question方法
question 是一个异步方法,所以当我们想要实现一个简易的计算器时,为了保证数字输入的顺序正确,就必须是要将函数嵌套起来使用,例如:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('请输入第一个数字:', (num1) => {
rl.question('请输入运算符:', (operator) => {
rl.question('请输入第二个数字:', (num2) => {
let result;
switch(operator) {
case '+':
result = parseFloat(num1) + parseFloat(num2);
break;
case '-':
result = parseFloat(num1) - parseFloat(num2);
break;
case '*':
result = parseFloat(num1) * parseFloat(num2);
break;
case '/':
result = parseFloat(num1) / parseFloat(num2);
break;
default:
console.log('运算符输入有误,请重新输入!');
rl.close();
return;
}
console.log(`${num1} ${operator} ${num2} = ${result}`);
rl.close();
});
});
});
这样会导致代码风格往又越来越长,相当不方便阅读和浏览,这个时候我们就可以将他们封装成promise对象,进行链式调用,就可以保证数字的输入顺序是一定的:
const readline = require('readline');
function getInput(prompt) {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
return new Promise((resolve, reject) => {
rl.question(prompt, (input) => {
rl.close();
resolve(input);
});
});
}
function calculate() {
let num1, num2, operator;
return getInput('请输入第一个数字:')
.then(input => {
num1 = parseFloat(input);
return getInput('请输入运算符:');
})
.then(input => {
operator = input.trim();
if (!['+', '-', '*', '/'].includes(operator)) {
throw new Error('运算符输入有误,请重新输入!');
}
return getInput('请输入第二个数字:');
})
.then(input => {
num2 = parseFloat(input);
let result;
switch(operator) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
default:
throw new Error('运算符输入有误,请重新输入!');
}
console.log(`${num1} ${operator} ${num2} = ${result}`);
})
.catch(error => {
console.error(error.message);
});
}
calculate();