Node.js 如何从nodejs请求中捕获诸如maxlistenerseceededwarning之类的错误?

Node.js 如何从nodejs请求中捕获诸如maxlistenerseceededwarning之类的错误?,node.js,error-handling,request,Node.js,Error Handling,Request,例如,以下错误未被常规的try/catch-on请求捕获: (node:6432) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 pipe listeners added. Use emitter.setMaxListeners() to increase limit Error: Exceeded maxRedirects. Probably stuck in a redirect loo

例如,以下错误未被常规的try/catch-on请求捕获:

(node:6432) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 pipe listeners added. Use emitter.setMaxListeners() to increase limit
Error: Exceeded maxRedirects. Probably stuck in a redirect loop https://9.20.65.117/
    at Redirect.onResponse (/XXX/node_modules/request/lib/redirect.js:98:27)
    at Request.onRequestResponse (/XXX/node_modules/request/request.js:990:22)
    at emitOne (events.js:115:13)
    at ClientRequest.emit (events.js:210:7)
    at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:565:21)
    at HTTPParser.parserOnHeadersComplete (_http_common.js:116:23)
    at TLSSocket.socketOnData (_http_client.js:454:20)
    at emitOne (events.js:115:13)
    at TLSSocket.emit (events.js:210:7)
    at addChunk (_stream_readable.js:266:12)

您只需在请求选项对象中禁用跟随3xx重定向即可
请求({followRedirect:false},…)


或者更改Nodejs
process.setMaxListeners(0)到0(未限制)

默认情况下,
请求
将跟踪多达十个重定向。如果您的服务器行为不正常,例如重定向到自身,则请求将在重定向后最多执行十次,然后返回一个错误

但是,该请求还侦听传入的请求主体-您可以通过管道将可读的消息传递到
请求
对象,该库将读取并上载该响应。这是通过在请求源代码中注册一个
请求.on('pipe',(src)=>…)
侦听器来完成的

问题是,在每个后续重定向上,
request
重新声明
.on('pipe',(src)=>…)
侦听器,因此在第7次重定向时,您有7个侦听器,依此类推。默认情况下,EventEmitter会在注册十个相同事件后发出警告,这就是为什么您会在EventEmitter和
请求的默认设置下检测到一次可能的内存泄漏

这可能是一个错误-如果您成功地将请求主体通过管道传输到第七个HTTP请求,那么此时您将有七个侦听器,每个侦听器独立启动,并且不清楚会发生什么-您可能会将请求主体复制七次,或者只是将七次写入未侦听的内容。但是,还有一个单独的问题,即此管道请求主体仅在第一次请求时发送,而不是所有请求,请参见#3138

因此,如果有大量重定向,是否确实存在内存泄漏?可能不会。。。侦听器在请求对象上注册,只要该请求对象超出范围(您没有在某个地方保存对它的引用),那么它最终将被垃圾收集,事件发射器将被收集

修复方法是什么?在此库中,每次发出新重定向时,要么取消注册并重新注册管道处理程序,要么在执行重定向时不要重新注册管道处理程序

在您的代码中,将maxrirects设置为9或EventEmitter default设置为11可能是安全的,只要您的
请求
对象正在被垃圾收集(它们可能正在被垃圾收集),这两者都可以解决问题


注意如果检测到除以下重定向以外的行为的
内存泄漏
,则可能仍然存在内存泄漏,请参见示例。

您的第一个方案在我的情况下不起作用,但第二个方案与setMaxListeners(2)配合得很好,因为我必须允许至少两个重定向。非常感谢。