Node.js Express - 代理请求后调用next()

时间:2015-09-03 15:39:23

标签: javascript node.js express http-proxy

我正在编写Express.js应用程序,它应该将请求路由到某个代理服务器,作为管道中的最后一步。我使用了http-proxy代理库,因为它支持websockets。问题是我需要在重定向请求后继续使用我的应用程序,以便收集我将用于记录的一些信息(api调用的响应时间等)。我的想法是在代理请求后调用next()函数,这应该让我回到堆栈中的第一个中间件?(如果我错了,请纠正我)然后计算出发点之间的时差和现在的。

在它之后立即调用proxy.web(req, res, {target: serviceAddress});next()之后 - 我收到错误:



_http_outgoing.js:335
    throw new Error('Can\'t set headers after they are sent.');
          ^
Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:335:11)
    at d:\WebStorm Projects\api-gateway\node_modules\http-proxy\lib\http-proxy\passes\web-outgoing.js:85:11
    at Array.forEach (native)
    at Array.writeHeaders (d:\WebStorm Projects\api-gateway\node_modules\http-proxy\lib\http-proxy\passes\web-outgoing.js:84:35)
    at ClientRequest.<anonymous> (d:\WebStorm Projects\api-gateway\node_modules\http-proxy\lib\http-proxy\passes\web-incoming.js:149:20)
    at ClientRequest.emit (events.js:107:17)
    at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:426:21)
    at HTTPParser.parserOnHeadersComplete (_http_common.js:111:23)
    at Socket.socketOnData (_http_client.js:317:20)
    at Socket.emit (events.js:107:17)
&#13;
&#13;
&#13;

调用proxy.web(...)后是否有保持工作的解决方案?或者,如果我的方法是错误的,有人可以建议我解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

发送回复后,您不应该致电langversion:5,因为您主动不希望剩余的中间件(也会尝试发送回复)来运行。< / p>

相反,您应该将所有日志记录中间件放在首位。