Nodejs 关于 Readline 类,获取用户输入方法时遇到一个诡异的问题
Nodejs 关于 Readline 类,获取用户输入方法时遇到一个诡异的问题
var readline = require(‘readline’);
var rl = readline.createInterface({ input:process.stdin, output:process.stdout });
rl.question(“what do you think of node.js?\n”,function(answer){ console.log(answer); rl.close(); });
这个是几乎是照搬的nodejs上的例子,但是发现一个问题:
首先cmd会打印what do you think of node.js?这句话等我输入。 当我输入比如一个aaaa,然后我想删掉两个,是用退格键的时候,what do you think of node.js?这局话会再次打印,点一次退格键就会打印一次,请问这是为什么?谢谢
PS:顺便问一下,问题里想上传图片只能是用网络图片吗?我本地的截图怎么贴上来?
Nodejs 关于 Readline 类,获取用户输入方法时遇到一个诡异的问题
在使用 Node.js 的 readline
模块时,你可能会遇到一些奇怪的行为。比如,当你试图删除输入时,命令行会反复打印提示信息。这个问题通常与终端的回显(echo)行为有关。
示例代码
var readline = require('readline');
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question("What do you think of Node.js?\n", function(answer) {
console.log(answer);
rl.close();
});
问题描述
当你在命令行中运行上述代码并输入文字时,如果尝试通过退格键(Backspace)来删除输入的内容,你会发现提示信息 What do you think of Node.js?
会被反复打印出来。每次按一次退格键,提示信息就会被打印一次。
原因分析
readline
模块在处理输入时,默认情况下会显示输入的内容。当你按下退格键时,它会重新读取输入流,并且由于 readline
模块的实现方式,会导致重复打印提示信息。
解决方案
你可以通过禁用终端的回显功能来解决这个问题。具体来说,可以使用 tty
模块中的 setRawMode
方法来改变终端的模式。
const readline = require('readline');
const tty = require('tty');
// 创建 readline 接口
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
// 设置为原始模式,禁用回显
if (tty.isatty(process.stdin.fd)) {
process.stdin.setRawMode(true);
}
rl.question("What do you think of Node.js?\n", function(answer) {
console.log(answer);
rl.close();
// 重置终端模式
if (tty.isatty(process.stdin.fd)) {
process.stdin.setRawMode(false);
}
});
注意事项
- 使用
setRawMode
方法需要确保终端支持该操作。 - 在调用
rl.close()
后,记得将终端模式恢复到正常状态,以避免影响其他部分的程序。
图片上传问题
关于上传图片的问题,大多数在线论坛或平台允许你直接上传本地图片,但也有部分平台可能只接受网络图片链接。如果你遇到这种情况,可以考虑使用第三方图床服务,如 Imgur、GitHub 等,将图片上传到这些服务后,再插入链接。
希望以上解答对你有所帮助!
你遇到的问题是因为 readline
在处理退格键(Backspace)时没有正确地移除已输入的字符,导致每次按键都会触发 rl.question
重新读取输入。
示例代码与解释
你可以使用 readline.createInterface
和 rl.on('line', ...)
来实现更灵活的输入处理。以下是一个改进后的示例:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question("What do you think of Node.js?\n", (answer) => {
console.log(`You said: ${answer}`);
rl.close();
});
解释
rl.question()
:这是一个简便的方法,用于一次性询问用户并获取其回答。当用户按下回车键后,会自动关闭rl
实例。- 退格键问题:由于
rl.question
方法内部机制,它可能无法很好地处理退格键。如果你需要处理复杂的输入,建议使用rl.on('line', ...)
方法来监听输入行。
更好的解决方案
如果你想处理更复杂的输入情况,可以使用 rl.on('line', ...)
:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.setPrompt("What do you think of Node.js?\n");
rl.prompt();
rl.on('line', (input) => {
console.log(`You said: ${input}`);
rl.close();
}).on('close', () => {
console.log('Goodbye!');
});
这样你可以更好地控制输入,并且能够处理退格键等特殊键。
关于上传图片
在大多数论坛中,通常只允许上传网络图片或者通过链接引用图片。你可以将本地截图上传到图床服务(如 Imgur),然后在帖子中插入图片链接。