跳转到内容
加入 「福强私学」,学习和了解更多关于技术、管理与人生的精彩内容。

如何对HonoJS运行期错误进行处理?

可以通过调用Hono的notFound与onError方法注册全局性的错误处理器。

不过,大部分情况下不需要添加,只有自己确实想定制处理的时候才需要。

假如处理不好,返回给客户端的信息可能会有混淆,所以,不建议覆写,尤其是onError(如果非要覆写,需要处理不同error类型的检查和分类)。

比如,今天(2024-01-19)就因为自定义了onError全都返回500, 导致我以为是hono框架的问题,实际上是我没有区分具体的Error类型,全都一股脑儿的返回500,从而形成错觉。 (即使hono原始返回的Error是401的错误,我也是返回了500,从而觉得是hono的问题,其实是我的问题)

// Custom Not Found Message
app.notFound((c) => {
return c.text('404 Not Found', 404)
})
// Error handling
// app.onError((err, c) => {
// // way:1 to handle:
// throw err
// // way:2 to handle:
// console.trace()
// console.error(err.toString())
// return c.text('Auth Internal Server Error', 500)
// })

另外,在编写handler逻辑的时候,如果中间有状态我们想要交给全局的错误处理器,可以通过抛出HTTPException的方式达成这一目的:

import { HTTPException } from 'hono/http-exception'
c.get("/xyz", (c)=> {
...
if(someConditionWeDontWantToContinue()) {
throw new HTTPException(403, { message: 'you are not allowed to come into here.' })
}
...
})

HTTPException的设计初衷更多是面向出现致命 1错误的场景(比如认证失败、没有权限等情况),在Handler较少用到,因为Handler中有更多选择来处理分支逻辑,所以,HTTPException反倒是在Hono的Middleware实现中更能发挥作用,因为Middleware不能返回Response(handler则可以),所以,除了让处理流程顺着Pipeline设计“顺流直下”,唯一可以干预的方式就是通过抛出HTTPException来中断执行流程。


Footnotes

  1. 其实也没有那么致命,只不过英文原文是Fatal Error。

加入「福强私学」

学习和了解更多关于技术、管理与人的精彩内容。

如果已经购买「福强私学」,可以直接点击这里开始访问

©️王福强个人版权所有