- Node.js+Webpack开发实战
- 夏磊
- 521字
- 2021-03-26 21:53:52
4.7 错误处理
错误处理指Express如何捕获和处理同步和异步发生的错误。Express带有默认错误处理程序,因此一般情况下无须手动编写错误处理程序。
4.7.1 同步错误
以下是一个同步错误的示例:
![](https://epubservercos.yuewen.com/1A2713/19549639501513406/epubprivate/OEBPS/Images/Figure-P77_92786.jpg?sign=1739503010-mJMufOFGY81zMuFThed1yutYwGQ1I9TJ-0-e44bff91882a7b1310598a72517b0eb8)
访问http://localhost:8080,将提示如下错误信息,这是Express默认的模板。
![](https://epubservercos.yuewen.com/1A2713/19549639501513406/epubprivate/OEBPS/Images/Figure-P77_92788.jpg?sign=1739503010-VrdQoEoivxo8kNlgvnnddXh0QasOxYe2-0-93cc5abd485abc9ce164d8d4f5823033)
同步错误一般交给框架自动处理即可。
4.7.2 异步错误
异步错误一般是发生在回调函数中的错误,需要通过next(err)才能捕获异步错误。
以下是捕获读取文件的错误示例:
![](https://epubservercos.yuewen.com/1A2713/19549639501513406/epubprivate/OEBPS/Images/Figure-P78_92790.jpg?sign=1739503010-mbBkLySpNmyUB89QZyoNUNvX6l9lYkpQ-0-135d51e1d83492e8b22ca2ab1509e9e1)
异步错误需要手动调用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=1739503010-HIWFdCohQvoLIPp9eLipsIkdB1aQWRRR-0-d78eb971c81b3388112706c267fa8d42)
4.7.4 多个错误处理函数
函数式编程一个重要的哲学是:一个函数只做一件事。以错误处理来说,我们需要记录日志、发送响应,这两件事可以通过两个中间件来完成:一个记录日志;另一个发送响应。
![](https://epubservercos.yuewen.com/1A2713/19549639501513406/epubprivate/OEBPS/Images/Figure-P79_92794.jpg?sign=1739503010-evo4mPlE0ikZq25LoqaoPUhyEqrzph7b-0-2fa67dfaf16b2423e304ff7173d9d6ad)
多个错误处理函数工作时不要忘记调用next(),否则不会进入下一个错误处理函数导致请求挂起。