Node.js Express - 代理请求后调用 next()
Node.js Express - calling next() after proxying the request
我正在编写 Express.js 应用程序,它应该将请求路由到某个代理服务器作为管道中的最后一步。我使用了 http-proxy
代理库,因为它支持 websockets。问题是我需要在重定向请求后继续使用我的应用程序,以便收集一些我将用于日志记录的信息(api 调用的响应时间等)。想法是在请求被代理后调用next()
函数,我应该return到堆栈中的第一个中间件?(如果我错了请纠正我)然后计算之间的时间差起点和现在。
在调用 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()
,因为您主动 不希望 剩余的中间件(它也会尝试发送响应)到运行.
相反,您应该将所有日志记录中间件放在首位。
我正在编写 Express.js 应用程序,它应该将请求路由到某个代理服务器作为管道中的最后一步。我使用了 http-proxy
代理库,因为它支持 websockets。问题是我需要在重定向请求后继续使用我的应用程序,以便收集一些我将用于日志记录的信息(api 调用的响应时间等)。想法是在请求被代理后调用next()
函数,我应该return到堆栈中的第一个中间件?(如果我错了请纠正我)然后计算之间的时间差起点和现在。
在调用 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()
,因为您主动 不希望 剩余的中间件(它也会尝试发送响应)到运行.
相反,您应该将所有日志记录中间件放在首位。