我正在尝试从服务器上的节点运行外部命令,并将该命令的输出逐行发送回客户端。也就是说,我想在生成时发送输出,而不是在命令完成时发送。
服务器端代码工作正常——命令运行并逐行读取输出。我将客户端回调传递给服务器以在新数据到达时调用。这适用于输出的第一行,但不适用于任何后续行。我已经验证服务器确实收到了后续的输出行,它们只是永远不会到达客户端。
服务器代码如下所示(简化)。
var spawn = require('child_process').spawn;
function run(cmd, cb) {
var child = spawn(cmd, []),
child.stdout.on('data', function(data) { cb(String(data)); });
}
socket.on("foo", function(cb) { return run("ls", cb); });
客户端使用此代码(再次简化)。
socket.emit("foo", function(data) {
console.log(data);
});
我在服务器或客户端没有收到任何错误消息。对此的任何见解将不胜感激。
更新
我通过显式使用套接字将数据发送回客户端解决了这个问题。作为参考,服务器代码现在看起来像这样。
function run(cmd, cb) {
var child = spawn(cmd, []),
child.stdout.on('data', function(data) {
socket.emit("output", String(data));
});
}
和客户。
socket.emit("foo", function(data) {
//
});
socket.on("output", function(data) {
console.log(data);
});