0

サーバー上のノードから外部コマンドを実行しようとしており、そのコマンドの出力をクライアントに 1 行ずつ送り返しています。つまり、コマンドが終了したときではなく、生成されたときに出力を送信したいのです。

サーバー側のコードは正常に動作します。コマンドが実行され、出力が 1 行ずつ読み取られます。新しいデータが到着したときに呼び出すために、クライアントのコールバックをサーバーに渡しています。これは、出力の最初の行では機能しますが、後続の行では機能しません。サーバーが実際に後続の出力行を受信することを確認しましたが、それらはクライアントに到達しません。

サーバー コードは次のようになります (簡略化)。

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 の記述方法により、コールバックを 2 回呼び出すことはできません。公式声明は次のとおりです。

確認応答関数は 1 回だけ呼び出すことができます。

詳細については、こちらをお読みください。

于 2013-10-18T14:55:18.377 に答える