0

我有这个非常简单的代码,似乎有一些问题。问题仅出在 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() + '');
});
4

2 回答 2

0

问题可能是 Chrome 不能关闭先前请求的连接。close您可以通过在子工作者中添加连接标头来修复它

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

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

或者,添加 this 而不是 thewriteHead也可以

response.shouldKeepAlive = false;

希望有帮助:)

于 2013-07-17T05:04:48.440 回答
0

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

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

还是进行设置,以便子进程仅异步发回数据,然后主进程发送响应?

于 2013-07-16T18:57:22.613 回答