1

着信 http get 要求に応答して処理を行う「キープ アライブ」nodejs 子プロセスを作成しました。

var spawn = require("child_process").spawn;
var child = spawn("long_live_exe");

app.get("/some_request", function(req, res){
     child.stdin.write("some_request\n");
     res.send("task completed");
 });

child.stdout理想的には、このように、に基づいて応答を返したいと思います

 app.get("/some_request", function(req, res){
     child.stdin.write("some_request\n");
     child.stdout.on('data', function(result){
            res.send(result);
     });
 });

問題は、各リクエストごとに、stdout.onイベント関数がもう一度配線されることです。それは悪いことではありませんか?

どういうわけか、 からコールバック関数を取得できたらstdin.write、コードを書くことができるか想像してみてください

 app.get("/some_request", function(req, res){
     child.stdin.write("some_request\n", function(reply){
            res.send(reply); 
      });

 });

問題はchild.stdout.on、http 要求のコールバックにフィードバックする方法です。

4

2 に答える 2

1

これを実現する最も効率的な方法は、stream-pipeを使用することです。

app.get("/some_request", function(req, res){
  child.stdin.write("some_request\n")
  child.stdout.pipe(res)
})

stdoutエミッタへの 1 回の書き込みに依存する必要がある場合は、直後に応答をフラッシュするためにres.endinsted ofを使用します ;)res.send

app.get("/some_request", function(req, res){
  child.stdin.write("some_request\n")
  child.stdout.once('data', res.end)
})
于 2016-11-03T11:16:30.977 に答える
1

使用once:

app.get("/some_request", function(req, res){
   child.stdin.write("some_request\n");
   child.stdout.once('data', function(result){
     res.send(result);
   });
});
于 2013-11-13T19:16:34.187 に答える