1

我产生了一个“保持活动状态”的 nodejs 子进程,它会响应传入的 http get 请求。

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

使用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 回答
1

实现这一点的最有效方法是使用流管道

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

如果您需要依赖stdout发射器上的单个写入,请使用res.endinsted ofres.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 回答