Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js Express-代理请求后调用next()_Javascript_Node.js_Express_Http Proxy - Fatal编程技术网

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

Javascript Node.js Express-代理请求后调用next(),javascript,node.js,express,http-proxy,Javascript,Node.js,Express,Http Proxy,我正在编写Express.js应用程序,作为管道中的最后一步,它应该将请求路由到某个代理服务器。我使用了httpproxyproxying库,因为它支持websockets。问题是,在请求被重定向之后,我需要继续使用我的应用程序,以便收集一些信息,用于记录日志(api调用的响应时间等)。其想法是在代理请求后调用next()函数,该函数应将我返回到堆栈中的第一个中间件(如果我错了,请纠正我),然后计算起始点和当前点之间的时间差 调用proxy.web(req,res,{target:service

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

调用
proxy.web(req,res,{target:serviceAddress})之后
next()
紧跟其后-我得到错误:

\u http\u outgoing.js:335
抛出新错误('发送头后无法设置头');
^
错误:发送邮件后无法设置邮件头。
在ServerResponse.OutgoingMessage.setHeader(_http_outgoing.js:335:11)
位于d:\WebStorm Projects\api gateway\node\u modules\http proxy\lib\http proxy\passs\web outgoing.js:85:11
at Array.forEach(本机)
在Array.writeHeaders(d:\WebStorm Projects\api gateway\node\u modules\http proxy\lib\http proxy\passes\web outgoing.js:84:35)
在ClientRequest。(d:\WebStorm Projects\api gateway\node\u modules\http proxy\lib\http proxy\passs\web incoming.js:149:20)
在ClientRequest.emit(events.js:107:17)
在HTTPParser.parserOnIncomingClient[作为onIncoming](_http_client.js:426:21)
在HTTPParser.parserOnHeadersComplete(_http_common.js:111:23)
在Socket.socketOnData(_http_client.js:317:20)

在Socket.emit(events.js:107:17)
上,发送响应后不应调用
next()
,因为您主动不希望剩余的中间件(也将尝试发送响应)运行


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

我还没有使用这个代理模块。这听起来像是当一个请求被代理时,它结束了请求,而响应现在被管道传输/发送回客户端。感谢您的澄清。但是,在这种情况下,如何计算处理所有中间软件所花费的时间?我的想法是将我的计算中间件作为堆栈中的第一个,然后创建
newdate()
对象并调用
next()
——在处理所有中间件之后,最后代理我想再次调用
next()
的请求,这应该会将我返回到第一个中间件,在这里,我可以创建第二个
new Date()
对象并计算差异。@OstapLisovyj:这实际上不起作用,因为大多数服务中间件是异步的。AFAIK,执行此操作的典型方法是代理
res.end()
以查看何时发送响应。抱歉,但我在这里有点困惑,这应该是smth-like
proxy.web(req,res.end(),{target:serviceAddress})?未来的需求是使用所有相关信息记录每个API调用,并根据这些信息对某个端点执行其他API调用;我的意思是,您的日志中间件应该包装
res.end()
,这样它就可以知道响应何时实际发送;您应该只处理
finish
事件。