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

奥斯塔普·利索维(Ostap Lisovyj)

我正在编写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)

是否有一种解决方案可以在proxy.web(...)调用后继续工作还是万一我的方法是错误的,有人可以建议我解决这个问题吗?

斯拉克斯

next()发送响应后不应调用,因为您实际上不希望其余的中间件(也将尝试发送响应)运行。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档