如何获取未终止命令的mongo shell输出(三点)

时间:2017-02-09 07:30:06

标签: node.js mongodb shell interactive

在mongo shell中键入未终止的命令时,它将返回三个点,表示需要更多输入才能完成此命令,如下所示:

> db.test.find(
... {
... 

我正在使用nodejs child_process.spawn创建一个mongo shell进程并监听其输出。我可以从mongo shell获得标准和错误输出但我无法获得...输出。下面是我的nodejs代码:

const shell = spawn('mongo', params);
      shell
        .stdout
        .on('data', (data) => {
          winston.debug('get output ' + data);

        });

      shell
        .stderr
        .on('data', (data) => {
          const output = data + '';
          winston.error('get error output ', data);

        });

我在代码下面运行以在shell上发送命令:

shell.stdin.write('db.test.find(');

我徘徊为什么我无法获得上述方法的...输出。这是一种特殊的输出吗?

EDIT1

我尝试使用node-ptypty.js。他们可以获得...输出,但他们将输入和输出数据混合在一起。不可能将它们分开。 我还尝试使用stdbufunbuffer来禁用缓冲区,但它仍然无效。 似乎nodejs child_process不能与交互式命令一起使用。

1 个答案:

答案 0 :(得分:0)

您的代码不包含任何写入您的子进程的stdin的内容,所以如果您获得指示不完整命令的省略号,我会感到惊讶,实际上您根本不发送任何命令 - 不完整或其他。

话说回来,许多命令行实用程序在发现连接到stdin / stdout的真实终端时表现不同。例如。 git log会在您直接运行结果时对结果进行分页,但在将结果传递给其他命令(例如git log | cat时)则不会,所以这也可能是这种情况。

这也可能与缓冲有关 - 如果您的流是行缓冲的,那么您将看不到任何未立即以换行符结束的行。

真正的问题是:你看到>提示了吗?你发送任何命令到mongo shell吗?

Scritping交互式CLI工具可能很棘手。例如。看看我在这里测试一个非常简单的交互式程序需要做些什么:

我必须创建两个命名管道,确保stdin,stderr和stdout没有缓冲,然后使用其他一些技巧使其工作。它是一个shell脚本,但它只是向您展示一个示例。