0

我正在尝试从服务器上的节点运行外部命令,并将该命令的输出逐行发送回客户端。也就是说,我想在生成时发送输出,而不是在命令完成时发送。

服务器端代码工作正常——命令运行并逐行读取输出。我将客户端回调传递给服务器以在新数据到达时调用。这适用于输出的第一行,但不适用于任何后续行。我已经验证服务器确实收到了后续的输出行,它们只是永远不会到达客户端。

服务器代码如下所示(简化)。

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);
});
4

1 回答 1

2

由于回调必须由客户端解释并实际发送到服务器,因此由于 Socket.IO 的编写方式,您不能两次调用回调。以下是官方声明:

一个确认函数只能被调用一次。

阅读此处了解更多信息。

于 2013-10-18T14:55:18.377 回答