在将其他内容打印到命令行后,可以打印当前的readline值吗?



我有一个简单的http服务器,它返回一个200成功的响应,以及一个readline函数,它打印输入到终端的任何内容。

问题:是否有一种方法可以收集已经输入的内容并在下面重新打印,以便用户可以在服务器继续处理请求的同时继续输入?或者在nodeJS应用程序中是否有更智能的方法来组合标准输入和标准输出?

解释:

服务器代码:

const http = require("http");
const readline = require("readline");
const host = "localhost";
const port = 8080;
const server = http.createServer(async (request, response) => {
console.log("request received");
response.writeHead(200);
response.end("success");
});
server.listen(port, host, () => {
console.log(`Listening on ${port}`);
});
const lineReader = readline.createInterface({
input: process.stdin
});
lineReader.on("line", (line) => {
console.log(`Received ${line}`);
});

如果我在命令行中输入一些东西,它会工作:

[~/workspace/tests/async-prompt] node index.js
Listening on 8080
Something
Received Something

如果我访问服务器,它可以工作:

[~/workspace/tests/async-prompt] node index.js
Listening on 8080
request received

但是如果,当我在终端输入时,一个请求进来了,它就混淆了:

[~/workspace/tests/async-prompt] node index.js
Listening on 8080
typingtypingtypingrequest received
typing
Received typingtypingtypingtyping

是否有一种方法可以在被其他打印到输出的东西打断时打印我在键入的内容?如果是这样,我就很满意了:

[~/workspace/tests/async-prompt] node index.js
Listening on 8080
typingtypingtypingrequest received
typingtypingtyping_

我在这篇文章中找到了答案:使用NodeJS/Readline/SocketIO进行实时聊天。我必须使用辅助函数从终端获取当前输入,然后清除行,打印输入输出,然后再次填充输入:

const lineReader = readline.createInterface({
input: process.stdin,
output: process.stdout,
prompt: "",
});
const safeLog = (message, ...optionalParams) => {
const currentlyTyped = lineReader.line;
process.stdout.clearLine();
process.stdout.cursorTo(0);
if (optionalParams.length > 0){
console.log(message, optionalParams);
} else {
console.log(message);
}
process.stdout.write(currentlyTyped);
}
const interval = setInterval(() => {
safeLog("Logging on timeout")
}, 2000);
lineReader.on("SIGINT", () => process.exit());
lineReader.on("line", (line) => {
safeLog(`Received ${line}`);
});

请注意,当像这样使用readline时,ctrl-c(或SIGINT)会杀死行读取器,但不一定会杀死应用程序的其余部分,所以我为此添加了一个处理程序。

最新更新