![Node.js+Webpack开发实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/131/36862131/b_36862131.jpg)
上QQ阅读APP看书,第一时间看更新
4.7 错误处理
错误处理指Express如何捕获和处理同步和异步发生的错误。Express带有默认错误处理程序,因此一般情况下无须手动编写错误处理程序。
4.7.1 同步错误
以下是一个同步错误的示例:
![](https://epubservercos.yuewen.com/1A2713/19549639501513406/epubprivate/OEBPS/Images/Figure-P77_92786.jpg?sign=1739530508-GrpeOmSAbMSKvsLPEc0V6qOchKkVV4iZ-0-fcb05a7077a7b13b3933fb9ed752d0a9)
访问http://localhost:8080,将提示如下错误信息,这是Express默认的模板。
![](https://epubservercos.yuewen.com/1A2713/19549639501513406/epubprivate/OEBPS/Images/Figure-P77_92788.jpg?sign=1739530508-bqyxrgYnn7jKWdXM8VgTxsaxpx1Jh0Q7-0-ff1c2498474f3f544ec23a9de3e15f15)
同步错误一般交给框架自动处理即可。
4.7.2 异步错误
异步错误一般是发生在回调函数中的错误,需要通过next(err)才能捕获异步错误。
以下是捕获读取文件的错误示例:
![](https://epubservercos.yuewen.com/1A2713/19549639501513406/epubprivate/OEBPS/Images/Figure-P78_92790.jpg?sign=1739530508-18qhzxZjJm4QWGNrouX9Jfkwx1PsWj3G-0-ad5c73253730c1e7e8583cc427f0cd23)
异步错误需要手动调用next()并传递Error对象。
传递给next()的参数可以是字符串、数字、Error对象等等,建议传递Error对象。只要传递了非空参数,Express就会执行错误处理流程。
4.7.3 自定义错误处理函数
如果需要自定义错误函数的逻辑,可以使用自己编写的错误处理函数。
错误处理函数的签名如下:
function errorHandler(err, req, resp, next)
· err:错误对象。
· req:请求对象。
· resp:响应对象。
· next:下一个错误处理器。
处理器本质也是中间件,但是需要放置在所有中间件、路由函数的后面才会生效。
以下是将默认的HTML错误响应更改为JSON的示例。
![](https://epubservercos.yuewen.com/1A2713/19549639501513406/epubprivate/OEBPS/Images/Figure-P78_92793.jpg?sign=1739530508-pCZksxNOrXPTHdZDo1zSPYaugqNorL3w-0-fb292d5e6aaf5d52a303cc2a5992c13a)
4.7.4 多个错误处理函数
函数式编程一个重要的哲学是:一个函数只做一件事。以错误处理来说,我们需要记录日志、发送响应,这两件事可以通过两个中间件来完成:一个记录日志;另一个发送响应。
![](https://epubservercos.yuewen.com/1A2713/19549639501513406/epubprivate/OEBPS/Images/Figure-P79_92794.jpg?sign=1739530508-qm56Jmi9ZZBAx7l9RVm6JuITf4qiZDTH-0-75d6974595240638b452a342931d9fb7)
多个错误处理函数工作时不要忘记调用next(),否则不会进入下一个错误处理函数导致请求挂起。