如何在Node.js中跟踪uncaughtException异常?

时间:2016-03-29 06:55:35

标签: node.js uncaught-exception

如何找出错误源自何处?错误输出看起来不太具描述性。从日志中可以看出ECONNRESET错误。

process.on('uncaughtException', function(err) {

})

1 个答案:

答案 0 :(得分:1)

我有同样的问题。

很难解决的是,这不是在我的代码中,而是在我使用的库中。

因此,您也已经发现,提供的堆栈跟踪完全没有帮助。即使在安装了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 );
        } );
    } );