如何获得蒙戈外壳输出(三点)对未终止命令
当键入一个蒙戈壳未终止命令,它会返回三个点表示需要更多的投入来完成这个命令象下面这样:如何获得蒙戈外壳输出(三点)对未终止命令
> 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-pty
和pty.js
。他们可以获得...
输出,但它们将输入和输出数据混合在一起。它们不可能分开。 我也尝试使用stdbuf
和unbuffer
来禁用缓冲区,但它仍然不起作用。 似乎nodejs child_process在交互式命令下不能很好地工作。
你的代码不包括写入你的子进程的标准输入的任何内容,所以如果你得到的省略号表明不完整的命令,但事实上你根本没有发送任何命令 - 不完整或其他。
前面已经说过,许多命令行实用程序在发现连接到它们的stdin/stdout的实际终端时行为会有所不同。例如。当您直接运行它时,git log
会将结果分页,但当您将结果传递给其他一些命令(如git log | cat
)时不会将结果分页,因此这可能也是这种情况。
这也可能与缓冲有关 - 如果您的流是行缓冲的,那么您将不会看到任何没有以换行符结束的行。
真正的问题是:你看到>
提示吗?你有没有发送任何命令到mongo shell?
Scritping交互式CLI工具可能会很棘手。例如。看看我不得不做测试一个非常简单的互动节目在这里:
我不得不创建两个命名管道,确保标准输入,标准错误和标准输出没有缓冲,然后使用一些其他的技巧,使其工作。这是一个shell脚本,但它仅仅是为了向你展示一个例子。
对不起,我没有把stdin源代码放在那里。当我发送'db.test.find('在stdin上,我没有从stdout或stderr得到任何输出,我确实看到'>'提示符,但它显示在控制台上而不是侦听器方法。 –
从Node.js产生'mongo' shell的目标是什么?相反,使用[MongoDB Node.js驱动程序](https://mongodb.github.io/node-mongodb-native/)会更直截了当。 – Stennie