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:顺便问一下,问题里想上传图片只能是用网络图片吗?我本地的截图怎么贴上来?


2 回复

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.createInterfacerl.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();
});

解释

  1. rl.question():这是一个简便的方法,用于一次性询问用户并获取其回答。当用户按下回车键后,会自动关闭 rl 实例。
  2. 退格键问题:由于 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),然后在帖子中插入图片链接。

回到顶部