gpt4 book ai didi

javascript - 在 NodeJS 中覆盖 res.write

转载 作者:搜寻专家 更新时间:2023-10-31 23:32:08 29 4
gpt4 key购买 nike

我已经使用 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,所以这没什么帮助。

我真的很困惑这里发生了什么。可能发生了什么?这不会直接影响输出,但我可能会同时向许多客户端提供数 GB 的压缩数据,并且重复执行所有操作会对我的服务器造成过度压力。

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

编辑:

如果你想知道,我已经阅读了这个问题:

Can I use an http.ServerResponse as a prototype in node.js?

最佳答案

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

关于javascript - 在 NodeJS 中覆盖 res.write,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5373304/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com