【问题标题】:Node.js Express - calling next() after proxying the requestNode.js Express - 在代理请求后调用 next()
【发布时间】:2015-09-03 15:39:23
【问题描述】:

我正在编写 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(...) 后是否有继续工作的解决方案?或者如果我的方法是错误的,有人可以建议我解决这个问题吗?

【问题讨论】:

  • 我没有使用过这个代理模块。听起来当一个请求被代理时,它结束了请求,并且响应现在被管道/发送回客户端。

标签: javascript node.js express http-proxy


【解决方案1】:

您不应该在发送响应后调用next(),因为您主动不希望剩余的中间件(也会尝试发送响应)运行。

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

【讨论】:

  • 感谢您的澄清。但是在那种情况下,计算处理所有中间件所花费的时间的方法是什么?我的想法是将我的计算中间件作为堆栈中的第一个,然后创建 new Date() 对象并调用 next() - 在处理所有中间件并最终代理我认为再次调用 next() 的请求后,它应该返回我到第一个中间件,在那里我可以创建第二个 new Date() 对象并计算差异。
  • @OstapLisovyj:这实际上行不通,因为大多数服务中间件都是异步的。 AFAIK 执行此操作的典型方法是代理 res.end() 以查看何时发送响应。
  • 对不起,我在这里有点困惑,这应该像proxy.web(req, res.end(), {target: serviceAddress}); 一样吗?未来的要求是使用所有相关信息记录每个 API 调用,并根据该信息对某个端点执行其他 API 调用。
  • 否;我的意思是你的日志中间件应该包装res.end(),这样它就可以找出响应的实际发送时间。
  • 但是,进一步研究,您不需要做任何这些;你应该只处理finish 事件。 github.com/nodejs/node-v0.x-archive/blob/master/lib/…
猜你喜欢
  • 1970-01-01
  • 2017-09-14
  • 2012-09-27
  • 2014-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多