我已经和NodeJS玩了一段时间了,我真的很喜欢它,但我已经把自己弄到墙上了......
我正在尝试创建一个连接模块来拦截http.ServerResponse方法。我的最终目标是允许用户对传出数据应用某种过滤器。例如,他们可以选择在数据输出之前应用压缩等。
我遇到了这个奇怪的错误......这种方法被调用的频率是它应该的两倍。
这是我的代码:
var http = require('http'), orig;
orig = http.ServerResponse.prototype.write;
function newWrite (chunk) {
console.log("Called");
orig.call(this, chunk);
}
http.ServerResponse.prototype.write = newWrite;
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write("Hello");
res.write(" World");
res.end();
console.log("Done");
}).listen(12345);
这是有效的,当我使用浏览器访问它时,我得到'Hello World'作为输出,但我得到4'被调用'到控制台,'完成'获得两次输出。这让我相信,由于某种原因,我的服务器代码被调用了两次。我在this.constructor上的newWrite方法中做了一个console.log,两个实例中的构造函数都是ServerResponse,所以这没什么用。
我真的很困惑这里发生了什么。什么可能会发生?这不会直接影响输出,但我可能会同时向许多客户端提供数十亿字节的压缩数据,并且两次执行操作都会给我的服务器带来不必要的压力。
这将成为更大文件服务器的一部分,因此强调不要做两次。
编辑:
我已经读过这个问题,以防你想知道:
答案 0 :(得分:6)
您的代码没有问题:如果您在console.log(req.url)
电话中添加了createServer
,您可能会发现它实际上被您的浏览器调用了两次 。如果html标记中未指定favicon,则大多数浏览器会对请求的网址发出请求,并对/favicon.ico
发出附加调用。
答案 1 :(得分:2)
您可以使用connect的favicon中间件来避免这个问题:
http://senchalabs.github.com/connect/middleware-favicon.html