Skip to content
Our Sponsors
Open in Anthropic

title: 错误处理 - Elysia 教程 layout: false search: false authors: [] head: - - meta - property: 'og:title' content: 错误处理 - Elysia 教程

- - meta
  - name: 'description'
    content: 学习如何在 Elysia 中处理错误,包括自定义错误处理、错误代码以及在您的 Web 应用程序中管理异常的最佳实践。

- - meta
  - property: 'og:description'
    content: 学习如何在 Elysia 中处理错误,包括自定义错误处理、错误代码以及在您的 Web 应用程序中管理异常的最佳实践。

错误处理

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 的上下文。

  1. Your own 404

    Let's override a default 404 response your own

  2. Your Custom Error

    Let's define your own custom error, throw it in GET "/" endpoint, and return a status 418

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)
  • index.ts