在NodeJS中覆盖res.write

bea*_*mit 3 javascript http stream connect node.js

我已经和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);
Run Code Online (Sandbox Code Playgroud)

这有效,当我使用浏览器访问它时,我得到'Hello World'作为输出,但我得到4'被调用'到控制台,'完成'得到输出两次.这让我相信,由于某种原因,我的服务器代码被调用了两次.我在this.constructor上的newWrite方法中做了一个console.log,两个实例中的构造函数都是ServerResponse,所以这没什么用.

我真的很困惑这里发生了什么.什么可能会发生?这不会直接影响输出,但我可能会同时向许多客户端提供数十亿字节的压缩数据,并且两次执行任务都会给我的服务器带来不必要的压力.

这将成为更大的文件服务器的一部分,因此强调不做两次所有事情.

编辑:

我已经读过这个问题,以防你想知道:

我可以在node.js中使用http.ServerResponse作为原型吗?

Adr*_*ien 6

您的代码没有问题:如果您console.log(req.url)createServer通话中添加了一个,您可能会看到它实际上是由您的浏览器调用两次.大多数浏览器都会请求所请求的URL,如果在html标记中没有指定favicon ,则会另外调用/favicon.ico.