![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=1738869653-7LR9cc5xxph0SulUrX5K3p8FLoq5CRvM-0-953fbf40ea3f9cce7fcda0df2e001f8a)
访问http://localhost:8080,将提示如下错误信息,这是Express默认的模板。
![](https://epubservercos.yuewen.com/1A2713/19549639501513406/epubprivate/OEBPS/Images/Figure-P77_92788.jpg?sign=1738869653-EcbshjupN6AhZDYnb5VRAkjb7JZ8fWwP-0-41def7421ea0543367d709ae7afa3629)
同步错误一般交给框架自动处理即可。
4.7.2 异步错误
异步错误一般是发生在回调函数中的错误,需要通过next(err)才能捕获异步错误。
以下是捕获读取文件的错误示例:
![](https://epubservercos.yuewen.com/1A2713/19549639501513406/epubprivate/OEBPS/Images/Figure-P78_92790.jpg?sign=1738869653-4XztsYGITtpjcNJtEJ24ngiZuOrhxcDc-0-9e63f87edad5112439be9c1c75f5d6f2)
异步错误需要手动调用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=1738869653-VRub8TbcNyHMOiziVQF6GbwvKb8sUaqR-0-1d3f4a53920b4d6d2ae9ff82f20d7fd1)
4.7.4 多个错误处理函数
函数式编程一个重要的哲学是:一个函数只做一件事。以错误处理来说,我们需要记录日志、发送响应,这两件事可以通过两个中间件来完成:一个记录日志;另一个发送响应。
![](https://epubservercos.yuewen.com/1A2713/19549639501513406/epubprivate/OEBPS/Images/Figure-P79_92794.jpg?sign=1738869653-pUui220ozreyvcIWE58MfHqaMtU8Ap2x-0-cafc7c35895dcd68d428c9bca5545491)
多个错误处理函数工作时不要忘记调用next(),否则不会进入下一个错误处理函数导致请求挂起。