我尝试使用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(...)
调用只是为了确保完成这个简单示例的上一个命令。
答案 0 :(得分:0)
通常情况下,我在发布问题的一分钟内就明白了这一点。
redis-cli
尝试检测标准输出是否为终端。使用
const child = exec("redis-cli --no-raw");
而不是
const child = exec("redis-cli");