防止 Node.js 控制台中的输入/输出混合?
Posted
技术标签:
【中文标题】防止 Node.js 控制台中的输入/输出混合?【英文标题】:Prevent input/output mixing in Node.js console? 【发布时间】:2015-09-30 07:01:26 【问题描述】:我刚刚设法让 Node.js minecraft bot API(称为mineflayer)工作。当我上次制作 minecraft bot 时(在 C++ 中,我一个人),我遇到了when writing in the console, the server messages would mix with whatever I'm writing 的问题。我当时得到的答案似乎有太复杂/不清楚的解决方案,所以我放弃了。
现在我希望 Node.js 解决了这个问题,但显然没有。 Node.js 中有一个简单的解决方案吗?我想要的是这样的:
但现在,我正在编写的命令与输出混合(红色是写入输入,绿色是控制台输出,使用 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);
);
【问题讨论】:
只是一个想法:我想你可以采取完全不同的方法,制作一个 Web 应用程序而不是命令行界面。您可以将 Node.js 与 Express 结合使用,并提供一个简单的页面,您可以在其中输入命令。您可以使用 html 元素(如按钮和其他表单控件)来改进您的用户界面。要实时显示输出,您可以使用socket.io。 【参考方案1】:我从一个简单的功能示例开始,只是为了向您展示一种方法:
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 escape codes 操作终端线。要使用它,只需在与上述代码相同的文件夹中运行以下命令:
npm install https://github.com/luciopaiva/ansi.git
你可以直接去my library's repository查看我的代码。
代码很简单,我建议你复制它并适应你的需要。
ansi.clear()
只是清空整个终端,然后ansi.row(1)
将光标移动到第一行,您将能够输入命令。在我的简单示例中,代码将仅打印到第 2 行用户在按下返回键之前键入的内容。然后只需运行上面的代码来查看它的工作情况,并将其调整为沿终端其余行滚动消息的机制。
【讨论】:
我想在那种情况下我不能再毫无问题地使用console.log
...
是的,您必须制作自己的自定义 log() 来跟踪行位置。
请记住,console.log
不适用于涉及操纵光标的任何其他方法。如果您使用像 blessed 或 TooTallNate 的 ansi 这样的库,您将不得不面对这个问题。就像我在对您的问题的评论中所说的那样,Web 应用程序是您机器人 UI 的更好解决方案 - 当然是一种更优雅的方法。以上是关于防止 Node.js 控制台中的输入/输出混合?的主要内容,如果未能解决你的问题,请参考以下文章