サーバー上のノードから外部コマンドを実行しようとしており、そのコマンドの出力をクライアントに 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);
});