防止Node.js控制台中的input/输出混合?

我只是设法得到一个Node.js的Minecraft bot API(称为mineflayer )来工作。 当我最后一次制作“我的世界”机器人时(我自己用C ++ 编写的 ),我遇到了一个问题,那就是在控制台上写信息时,服务器信息会和我正在写的东西混合在一起 。 我当时回答的答案似乎有太复杂/不清楚的解决办法,所以我放弃了。

现在我希望Node.js解决了这个问题,但显然不是。 Node.js中有一个简单的解决scheme吗? 我想要的是这样的:

图片描述

但现在,我正在写的命令与输出混合(红色是写入input,绿色是控制台输出,使用GIMP着色):

图片描述

我正在使用readline模块:

 var readline = require("readline"); var rl = readline.createInterface({ input: process.stdin, output: null, }); rl.on('line', function(line) { var inp = line.trim(); //Bot internal commands start with ~ if(line[0]=='~') { command(line.substr(1)); } else { //use server chat bot.chat(line); } }); 

我从一个简单的function示例开始,向您展示一种实现方法:

 var readline = require("readline"), ansi = require('ansi'); var rl = readline.createInterface({ input: process.stdin, output: null }); ansi.clear(); ansi.row(1); rl.on('line', function(line) { ansi.row(2); ansi.clearLine(); ansi.print(line); ansi.row(1); ansi.clearLine(); }); 

ansi是我几个月前使用ANSI转义代码操纵terminal线的一个简单testing。 要使用它,只需在与上面的代码相同的文件夹中运行以下命令:

 npm install https://github.com/luciopaiva/ansi.git 

你可以通过直接到我的图书馆的存储库检查我的代码。

代码非常简单,我build议您复制它,并适应您的需求。

ansi.clear()只是清除整个terminal,然后ansi.row(1)将光标移动到第一行,您将能够input命令。 在我的简单示例中,代码将只打印到行#2的用户在返回键之前键入的内容。 然后,只需运行上面的代码,看看它是否工作,并将其适应于沿着terminal的其余行滚动消息的机制。