Nodejs子进程stdin.write没有回调

时间:2013-11-13 18:08:50

标签: node.js

我已经生成了一个“keep alive”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请求回调?

2 个答案:

答案 0 :(得分:1)

使用once

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

答案 1 :(得分:1)

实现此目标的最有效方法是使用stream-pipe

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

如果您需要依靠stdout发射器上的一次写入,请res.end res.send使用app.get("/some_request", function(req, res){ child.stdin.write("some_request\n") child.stdout.once('data', res.end) }) ,以便立即刷新响应;)

 <script>

        function GetData() {

            $.ajax({
                url: 'http://localhost:27738/WebForm3.aspx/GetData',
                type: 'POST',
                data: '',
                dataType: 'json',
                contentType: 'application/json',
                success: function (data) {

                    var obj = document.getElementById("lblData");
                    obj.innerHTML = obj.innerHTML + data.d;


                  
                    //Call RegisterHover
                    $(document).ready(function () {
                        registerHover();
                    });
                }
            });
        }
    </script>