3

我正在寻找构建在node-http-proxy之上但添加缓存支持的 NPM 模块,如 squid/varnish,但在 node.js 中。

在我的脑海中,它会像这样工作:

  • 我的 NPM 模块不依赖于 http-proxy,只会“包装”任何给http.createServer. 这个想法是你将它与 http-proxy 结合起来,但它并不假设。
  • 它将查看,req如果它有一个缓存的版本,它会提供服务。
  • 如果没有,它将委托给原始回调,检查响应以查看是否可以缓存。
  • 发生缓存,并返回实际响应。

逻辑非常简单,但我对 node.js 的内部结构和概念不是很熟悉,我什至在努力弄清楚如何获取响应的内容。

给定这个例子:

var http = require('http');

http.createServer(function(req, res) {
  res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' })
  res.write('Hello World!');
  res.end();
}).listen(80);

我如何从该响应对象中取回数据?理想情况下,我只是“观察”响应并在写入数据时对其进行处理,而不是回顾性地将数据从中提取出来。

我试着做:

res.on('data', function(chunk) {
  console.log('Data written: ' + chunk);
});

但这似乎永远不会被调用。

然后我尝试了:

res.connection.on('data', function(chunk) {
  console.log('Data written: ' + chunk);
});

但这只是转储了请求数据,而不是响应数据。假设您对响应是如何生成的一无所知,那么过滤响应数据的正确方法是什么?

如果我表达我对 node 的完全缺乏理解并且应该阅读某种“node.js 概念的新手指南”,请指导我。我不是懒惰,我只是迷路了。

EDIT | Looks like I can method-swizzle write() and writeHead() on the response to intercept the invocations to them, but this feels wrong.

4

2 回答 2

1

Looks like redifinition write and writeHead methods of ServerResponse the only way to do that. Node API has no native events to handle outgoing data.

于 2012-08-14T12:05:28.013 回答
1

The easiest and most efficient way is replacing those functions with your custom function. When creating a http server by myhttp.createServer you call http.createServer and intercept the function(req, res) callback. You replace res with your wrapper calling the original res object. But you can add logic for logging res.writeHead calls.

于 2012-08-14T12:06:56.200 回答