localhost
GET
Interactive Playground
当前部署环境只有 2C4G。为了避免构建阶段因 Monaco、Rollup Browser 和 类型分析导致 OOM,这个版本只保留教程内容,不内嵌在线 Playground。
bun run build:full如需完整交互体验,请在更高配置环境执行上面的完整构建命令。
Elysia 钩子仅封装到其自己的实例中。
如果你创建一个新实例,它不会与其他实例共享钩子。
import { Elysia } from 'elysia'
const profile = new Elysia()
.onBeforeHandle(
({ query: { name }, status }) => {
if(!name)
return status(401)
}
)
.get('/profile', () => '嗨!')
new Elysia()
.use(profile)
.patch('/rename', () => '好的!XD')
.listen(3000)尝试在 URL 地址栏中更改路径为 /rename 并查看结果
Elysia 隔离生命周期,除非明确声明。
这类似于 JavaScript 中的 export,您需要导出函数才能使其可用于模块外部。
要将生命周期“导出”到其他实例,必须指定范围。
有 3 种可用范围:
在我们的例子中,我们希望将登录检查应用于直接父级 app,因此可以使用 scoped 或 global。
import { Elysia } from 'elysia'
const profile = new Elysia()
.onBeforeHandle(
{ as: 'scoped' },
({ cookie }) => {
throwIfNotSignIn(cookie)
}
)
.get('/profile', () => '你好!')
const app = new Elysia()
.use(profile)
// 这里有登录检查
.patch('/rename', ({ body }) => updateProfile(body))将生命周期转换为 "scoped" 将生命周期导出到 父实例。 而 "global" 将生命周期导出到 所有具有插件的实例。
在 范围 中了解更多关于此的信息。
类似于生命周期,schema 也封装到其自己的实例中。
我们可以像生命周期一样指定保护范围。
import { Elysia } from 'elysia'
const user = new Elysia()
.guard({
as: 'scoped',
query: t.Object({
age: t.Number(),
name: t.Optional(t.String())
}),
beforeHandle({ query: { age }, status }) {
if(age < 18) return status(403)
}
})
.get('/profile', () => '嗨!')
.get('/settings', () => '设置')非常重要的是要注意,每个钩子将影响其声明后面的所有路由。
有关更多信息,请参见 范围。
让我们为 nameCheck 和 ageCheck 定义一个范围,以使我们的应用正常工作。
我们可以按如下方式修改范围:
nameCheck 的范围修改为 scopedageCheck 的范围修改为 globalimport { Elysia, t } from 'elysia'
const nameCheck = new Elysia()
.onBeforeHandle(
{ as: 'scoped' },
({ query: { name }, status }) => {
if(!name) return status(401)
}
)
const ageCheck = new Elysia()
.guard({
as: 'global',
query: t.Object({
age: t.Number(),
name: t.Optional(t.String())
}),
beforeHandle({ query: { age }, status }) {
if(age < 18) return status(403)
}
})
const name = new Elysia()
.use(nameCheck)
.patch('/rename', () => '好的!XD')
const profile = new Elysia()
.use(ageCheck)
.use(name)
.get('/profile', () => '嗨!')
new Elysia()
.use(profile)
.listen(3000)