【问题标题】:Prevent input/output mixing in Node.js console?防止 Node.js 控制台中的输入/输出混合?
【发布时间】: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

标签: javascript node.js


【解决方案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 的更好解决方案 - 当然是一种更优雅的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多