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