如何获得蒙戈外壳输出(三点)对未终止命令

问题描述:

当键入一个蒙戈壳未终止命令,它会返回三个点表示需要更多的投入来完成这个命令象下面这样:如何获得蒙戈外壳输出(三点)对未终止命令

> 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.stdin.write('db.test.find('); 

我徘徊为什么我不能得到上述方法...输出。这是一个特殊的输出吗?

EDIT1

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

+0

从Node.js产生'mongo' shell的目标是什么?相反,使用[MongoDB Node.js驱动程序](https://mongodb.github.io/node-mongodb-native/)会更直截了当。 – Stennie

你的代码不包括写入你的子进程的标准输入的任何内容,所以如果你得到的省略号表明不完整的命令,但事实上你根本没有发送任何命令 - 不完整或其他。

前面已经说过,许多命令行实用程序在发现连接到它们的stdin/stdout的实际终端时行为会有所不同。例如。当您直接运行它时,git log会将结果分页,但当您将结果传递给其他一些命令(如git log | cat)时不会将结果分页,因此这可能也是这种情况。

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

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

Scritping交互式CLI工具可能会很棘手。例如。看看我不得不做测试一个非常简单的互动节目在这里:

我不得不创建两个命名管道,确保标准输入,标准错误和标准输出没有缓冲,然后使用一些其他的技巧,使其工作。这是一个shell脚本,但它仅仅是为了向你展示一个例子。

+0

对不起,我没有把stdin源代码放在那里。当我发送'db.test.find('在stdin上,我没有从stdout或stderr得到任何输出,我确实看到'>'提示符,但它显示在控制台上而不是侦听器方法。 –