0

我正在尝试使用模块中的节点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(...)调用只是为了确保完成这个简单示例的前一个命令。

4

1 回答 1

0

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

redis-cli尝试检测标准输出是否是终端。这个问题是通过使用解决的

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

代替

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

实时调频

于 2017-05-03T03:03:52.667 回答