本文以连接错误ECONNREFUSED为例,看看nodejs对错误处理的过程。接着我们看一下C++层connect的逻辑C++层直接调用Libuv的uv_tcp_connect,并且设置回调是AfterConnect。接着我们看libuv的实现。我们看到Libuv以异步的方式调用操作系统,然后把request挂载到handle中,并且注册等待可写事件,当连接失败的时候,就会执行uv stream_io回调,我们看一下Libuv的处理。获取错误信息后回调C++层的AfterConnect。exceptionWithHostPort构造错误信息,然后销毁socket并且以ex为参数触发error事件。我们看到错误信息主要通过uvErrmapGet获取继续往下看,uvErrmapGet调用了C++层的uv模块的getErrorMap。当操作系统收到一个发给该socket的rst包的时候会执行tcp_reset,我们看到当socket处于发送syn包等待ack的时候,如果收到一个fin包,则会设置错误码为ECONNREFUSED。

nodejs的错误处理过程记录

nodejs的错误处理过程记录

nodejs的错误处理过程记录

nodejs的错误处理过程记录

nodejs的错误处理过程记录