我正在使用 node-http-proxy .但是,除了中继 HTTP 请求外,我还需要监听传入和传出的数据。
拦截响应数据是我苦苦挣扎的地方。 Node 的 ServerResponse
对象(以及更一般的 WritableStream
接口(interface))不广播 'data'
事件。 http-proxy
似乎创建了它自己的内部请求,它会产生一个 ClientResponse 对象(它会广播 'data'
事件)但是这个对象不会在代理之外公开.
有什么想法可以解决这个问题而不用猴子修补 node-http-proxy 或在响应对象周围创建包装器吗?
最佳答案
Github 上 node-http-proxy 问题中的相关问题似乎暗示这是不可能的。对于其他人 future 的尝试,以下是我如何破解这个问题:
- 您很快就会发现代理只调用了
writeHead()
、write()
和res
对象 - 由于
res
已经是一个EventEmitter
,您可以开始发出新的自定义事件 - 监听这些新事件以组装响应数据,然后使用它
var eventifyResponse = function(res) {
var methods = ['writeHead', 'write', 'end'];
methods.forEach(function(method){
var oldMethod = res[method]; // remember original method
res[method] = function() { // replace with a wrapper
oldMethod.apply(this, arguments); // call original method
arguments = Array.prototype.slice.call(arguments, 0);
arguments.unshift("method_" + method);
this.emit.apply(this, arguments); // broadcast the event
};
});
};
res = eventifyResponse(res), outputData = '';
res.on('method_writeHead', function(statusCode, headers) { saveHeaders(); });
res.on('method_write', function(data) { outputData += data; });
res.on('method_end', function(data) { use_data(outputData + data); });
proxy.proxyRequest(req, res, options)
关于http - 如何监听 Node http-proxy 流量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9741607/