我已经用 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 个“Called”,而“Done”得到两次输出。这让我相信由于某种原因,我的服务器代码被调用了两次。我在 this.constructor 的 newWrite 方法中做了一个 console.log,两个实例中的构造函数都是 ServerResponse,所以这没有多大帮助。
我真的很困惑这里发生了什么。可能发生了什么?这不会直接影响输出,但我可能会同时向许多客户端提供千兆字节的压缩数据,并且做任何事情两次会给我的服务器带来过度的压力。
这将成为更大文件服务器的一部分,因此强调不要将所有事情都做两次。
编辑:
如果您想知道,我已经阅读了这个问题:
Can I use an http.ServerResponse as a prototype in node.js?
最佳答案
您的代码没有问题:如果您在 console.log(req.url)
调用中添加 createServer
,您可能会看到它实际上被您的浏览器 调用了两次 。如果在 html 标记中没有指定 favicon,大多数浏览器会请求所请求的 url 和 附加 调用 /favicon.ico
。
关于javascript - 覆盖 NodeJS 中的 res.write,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5373304/