防止 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 控制台中的输入/输出混合?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js学习05:动手啦,基于node.js编写程序

node.js的异步编程

Node.js 集群;仅在使用颜色时混乱的控制台输出

如何防止 R Expss 在输出数据框中将变量名称与行标签混合?

获取 node.js 中所有嵌套子进程的标准输出

如何防止 node.js 中的内存泄漏?