node child_process 没有将所有内容写入标准输出

node child_process not writing everything to stdout

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

航站楼:

$ 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 实现方式的一个怪癖,但数据必须去 somewhere.

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

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

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

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

而不是

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

RTFM.