Javascript Node.js子进程套接字写入在Chrome&;中表现异常;FF

Javascript Node.js子进程套接字写入在Chrome&;中表现异常;FF,javascript,node.js,http,child-process,Javascript,Node.js,Http,Child Process,我有一个非常简单的代码,似乎给一些问题。问题只存在于Chrome和Firefox(我尝试了Opera和命令行curl请求,效果很好) 如果我点击URLhttp://localhost:3000/在浏览器中,它将显示当前时间戳。当我按一次刷新时,它会按预期工作。但在此之后,它只适用于备用请求。一次刷新给出结果,另一次进入永久等待,最终超时。我只在Chrome和Firefox中遇到了这个问题。有人能指出为什么会发生这种情况吗 如果我删除了子进程的东西,也就是说,从主进程本身提供请求,它就可以正常工作

我有一个非常简单的代码,似乎给一些问题。问题只存在于Chrome和Firefox(我尝试了Opera和命令行curl请求,效果很好)

如果我点击URL
http://localhost:3000/
在浏览器中,它将显示当前时间戳。当我按一次刷新时,它会按预期工作。但在此之后,它只适用于备用请求。一次刷新给出结果,另一次进入永久等待,最终超时。我只在Chrome和Firefox中遇到了这个问题。有人能指出为什么会发生这种情况吗

如果我删除了子进程的东西,也就是说,从主进程本身提供请求,它就可以正常工作。我想知道,如果我为同一个套接字创建另一个响应对象并通过该套接字发送数据,会有什么不同。最重要的是,Chrome和FF的代码有什么问题,为什么

服务器代码

var http = require('http');
var child_process = require('child_process');

var worker = child_process.fork('./worker.js');

http.createServer(function (req, res) {
    if (req.url == '/favicon.ico') {
        res.end();
        return;
    }

    worker.send({ 'event': 'start' }, res.socket);
}).listen(3000);
工人代码是

var http = require('http');

process.on('message', function (data, socket) {
    var response = new http.ServerResponse({});
    response.assignSocket(socket);

    response.end(new Date().getTime() + '');
});

从createServer自动生成的req/res对象可能已经声明了套接字,您可能会遇到问题

尝试将响应传递给子进程,而不仅仅是套接字


或者设置一些设置,使子进程只异步发送回数据,然后主进程发送响应?

问题可能是Chrome不能关闭前一个请求的连接。您可以通过在子worker中添加连接
close
头来修复它

var response = new http.ServerResponse({});
response.writeHead(200, {'connection': 'close'});
response.assignSocket(socket);

response.end(new Date().getTime() + '');
或者,添加此项而不是
写头也可以

response.shouldKeepAlive = false;

希望有帮助:)

Node.js不允许发送所有对象的句柄。响应对象是ServerResponse类的一个实例,传递会导致错误。另外,如果可能的话,我不希望主服务器为请求提供服务。将有几个工人和大量的要求。我不希望所有工作人员都使用process.send发送数据。通过这样做,master必须将响应对象保留在某个地方,并维护一个请求散列,这样才能知道这个响应属于哪个请求。请提出建议。这真的很奇怪,我只是测试了一下,我能说的最确定的一点是服务器没有发出“请求”事件(这是通过将函数传递给createServer来监听的)。也许Firefox出于某种原因没有发送请求?我不知道,抱歉。很高兴知道问题至少是一致的。无论如何。谢谢您的尝试。:)@Russbear仅供参考,您可以尝试我建议的修复…:)刚刚测试过,这在Firefox中修复了它。