错误处理
onError 在抛出错误时被调用。它接受与处理器类似的 上下文,但包含一个额外的:
- error - 一个抛出的错误
- code - 错误代码
typescript
import { Elysia } from 'elysia'
new Elysia()
.onError(({ code, status }) => {
if(code === "NOT_FOUND")
return '唔~ 你迷路了吗?'
return status(418, "我的错!但我很可爱所以你会原谅我的,对吗?")
})
.get('/', () => 'ok')
.listen(3000)你可以返回一个 status 来覆盖默认的错误状态。
自定义错误
你可以使用 error code 提供一个自定义错误,如下所示:
typescript
import { Elysia } from 'elysia'
class NicheError extends Error {
constructor(message: string) {
super(message)
}
}
new Elysia()
.error({
'NICHE': NicheError
})
.onError(({ error, code, status }) => {
if(code === 'NICHE') {
// 类型为 NicheError
console.log(error)
return status(418, "我们不知道你是怎么来到这里的")
}
})
.get('/', () => {
throw new NicheError('自定义错误消息')
})
.listen(3000)Elysia 使用 error code 来缩小错误类型。
建议注册一个自定义错误,以便 Elysia 能够缩小类型范围。
错误状态码
你也可以通过向类添加 status 属性来提供自定义状态码:
typescript
import { Elysia } from 'elysia'
class NicheError extends Error {
status = 418
constructor(message: string) {
super(message)
}
}如果抛出此错误,Elysia 将使用此状态码,参见 Custom Status Code。
错误响应
你也可以通过提供一个 toResponse 方法,直接在错误中定义自定义错误响应:
typescript
import { Elysia } from 'elysia'
class NicheError extends Error {
status = 418
constructor(message: string) {
super(message)
}
toResponse() {
return { message: this.message }
}
}如果抛出此错误,Elysia 将使用此响应,参见 Custom Error Response。
练习
让我们尝试扩展 Elysia 的上下文。
Show answer
1. 你可以通过 "NOT_FOUND" 来缩小错误范围,以覆盖 404 响应。 2. 将你的错误通过 `.error()` 方法提供,并设置 status 属性为 418。
typescript
import { Elysia } from 'elysia'
class YourError extends Error {
status = 418
constructor(message: string) {
super(message)
}
}
new Elysia()
.error({
"YOUR_ERROR": YourError
})
.onError(({ code, status }) => {
if(code === "NOT_FOUND")
return "嗨"
})
.get('/', () => {
throw new YourError("A")
})
.listen(3000)