node版本v5.2.0 主进程文件如下:
var cp=require(‘child_process’); var temp=cp.fork(’./child’); var binded=false; httpsModule.Server(options, function(req,res){ temp.send(‘2’); //首次访问时绑定message事件 if(!binded){ temp.on(‘message’,function(m){ res.write(‘333’); res.end(); }); binded=true; } }).listen(443, function(err){});
child.js如下:
process.on(‘message’,function (argument) { setTimeout(function(){ process.send(‘123’); },100); })
首次访问,页面正常输出333 然后同时出现如下情况:
然后服务器就挂了
因为默认会有一次/favicon.ico的访问,所以过程是:第一次访问,正常输出,无报错;第二次访问,输出错误,同时抛出write after end 似乎第二次访问时的res没有更新,仍然是第一次的response句柄。 这是为什么?如何解决?
这得从闭包说起 1)第一次请求的时候,binded 为false,所以执行了监听 message 的操作
function(m){
res.write(‘333’);
res.end();
}
其实这是个闭包,里面的 res 是第一次请求的 res 对象。 闭包通俗点的说法就是:函数声明时,对作用域内的上下文环境做了一份快照。
2)看题主的写法,似乎想和客户端之间保持一个长连接的消息通道 建议看下 websocket,node 的话,推荐 socket.io
http 连接不应该这样用,child_process 似乎也不应该这样用~
var sServer=httpsModule.Server(options, function(req,res){
temp.send('server',sServer);
}).listen(443, function(err){
});
是不是这样用?