在发送到浏览器之前过滤node.js响应(标题和正文)?

时间:2012-08-14 11:20:02

标签: node.js

我正在寻找一个构建在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.js概念的新手指南”,请指导我。我不是懒惰,我只是迷路了。

编辑|看起来我可以对响应进行方法调整write()writeHead()来拦截对它们的调用,但这感觉不对。

2 个答案:

答案 0 :(得分:1)

看起来像ServerResponse的重定义write和writeHead方法是唯一的方法。 Node API没有处理传出数据的本机事件。

答案 1 :(得分:1)

最简单,最有效的方法是使用自定义功能替换这些功能。在myhttp.createServer创建http服务器时,您调用http.createServer并拦截function(req, res)回调。您使用包装器调用原始res对象替换res。但您可以添加用于记录res.writeHead次呼叫的逻辑。