忽略节点服务器应用程序调用客户端回调

时间:2013-10-18 14:39:38

标签: node.js socket.io child-process

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

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

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

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

1 个答案:

答案 0 :(得分:2)

由于回调必须由客户端解释并实际发送到服务器,因此无法通过编写Socket.IO的方式调用回调函数。这是官方声明:

  

确认功能只能调用一次。

阅读here了解详情。