我遇到了同样的问题。
让事情变得困难的是,它不在我的代码中,而是在我使用的库中。
所以您也发现,提供的堆栈跟踪根本没有帮助。即使在安装了像 longjohn 这样的包之后,您从该服务器崩溃中获得的堆栈跟踪都是内部的:
Error: read ECONNRESET
at TCP.onStreamRead (internal/stream_base_commons.js:111:27)
---------------------------------------------
at _destroy (internal/streams/destroy.js:34:15)
at Socket._destroy (net.js:607:3)
at Socket.destroy (internal/streams/destroy.js:32:8)
at TCP.onStreamRead (internal/stream_base_commons.js:111:19)
Waiting for the debugger to disconnect...
您需要处理emitter.on("error") 事件,基本上如下所述:Node js ECONNRESET
在我的情况下,我能够通过curl 请求发送无效密码来重现错误。并且能够解决,因为我使用的库为传入请求公开了 request 对象。
因此,这是我的解决方案代码:
function onRequest(requestDetails){
requestDetails.request.connection.on( "error", ( _err ) => {
log.error( "request.connection.on.error", _err );
} );
let reqSocket = requestDetails.request.socket;
reqSocket.on( "error", ( _err ) => {
log.error( "request.socket.on.error", _err );
reqSocket.destroy( _err );
} );
requestDetails.request.on( "error", ( _err ) => {
log.error( "request.on.error", _err );
} );
// my actual request handling code goes here.....
}
我还为 server 对象添加了错误处理程序,尽管在这种情况下不需要这样做:
server.on( 'requestFailed', ( { request, error }: any ) => {
log.error( `Request ${ request.url } failed`, error );
} );
server.on( 'error', ( ...args: any[] ) => {
log.error( "server.on.error", args );
} );
server.on( 'connection', function ( socket ) {
socket.on( 'error', function ( err ) {
log.error( "Client socket error:", err );
socket.destroy( err );
} );
} );