node child_process没有将所有内容写入stdout

时间:2017-05-03 02:58:23

标签: node.js redis child-process redis-cli

我尝试使用spawn模块中的节点exec / child_process函数。但是我注意到我在真实终端和命令行中看到的奇怪区别。这是一个例子:

终端:

$ redis-cli
127.0.0.1:6379> hmset hash name Jack age 33
OK
127.0.0.1:6379> hscan hash 0
1) "0"
2) 1) "name"
   2) "Jack"
   3) "age"
   4) "33"

在node.js中:

const child = exec("redis-cli");
child.stdin.setDefaultEncoding("utf-8");
child.stdout.on("data", data => console.log(data.toString()));

child.stdin.write("hmset hash name Jack age 33\n"); // same as first command from cli example

await new Promise(r => setTimeout(r, 1000));

child.stdin.write("hscan hash 0\n"); // same as second command from cli example

await new Promise(r => setTimeout(r, 1000));

这是写入控制台的内容:

OK

0
name
Jack
age
33

在这种情况下,数字1)2)等缺失。任何想法如何说服child_process也将它们写入控制台?我猜这个特定的例子是redis-cli如何实现的怪癖,但数据必须某些在哪里。

await new Promise(...)调用只是为了确保完成这个简单示例的上一个命令。

1 个答案:

答案 0 :(得分:0)

通常情况下,我在发布问题的一分钟内就明白了这一点。

redis-cli尝试检测标准输出是否为终端。使用

解决了这个问题
const child = exec("redis-cli --no-raw");

而不是

const child = exec("redis-cli");

RTFM