速查表
这里是一些常见 Elysia 模式的快速概述
Hello World
一个简单的 hello world
typescript
import { Elysia } from 'elysia'
new Elysia()
.get('/', () => 'Hello World')
.listen(3000)
自定义 HTTP 方法
使用自定义 HTTP 方法/动词定义路由
参见 路由
typescript
import { Elysia } from 'elysia'
new Elysia()
.get('/hi', () => 'Hi')
.post('/hi', () => 'From Post')
.put('/hi', () => 'From Put')
.route('M-SEARCH', '/hi', () => 'Custom Method')
.listen(3000)
路径参数
使用动态路径参数
参见 路径
typescript
import { Elysia } from 'elysia'
new Elysia()
.get('/id/:id', ({ params: { id } }) => id)
.get('/rest/*', () => 'Rest')
.listen(3000)
返回 JSON
Elysia 会自动将响应转换为 JSON
参见 处理器
typescript
import { Elysia } from 'elysia'
new Elysia()
.get('/json', () => {
return {
hello: 'Elysia'
}
})
.listen(3000)
返回文件
文件可以作为 formdata 响应返回
响应必须是 1 级深度对象
typescript
import { Elysia, file } from 'elysia'
new Elysia()
.get('/json', () => {
return {
hello: 'Elysia',
image: file('public/cat.jpg')
}
})
.listen(3000)
头部和状态
设置自定义头部和状态码
参见 处理器
typescript
import { Elysia } from 'elysia'
new Elysia()
.get('/', ({ set, error }) => {
set.headers['x-powered-by'] = 'Elysia'
return error(418, "I'm a teapot")
})
.listen(3000)
组
为子路由定义一次前缀
参见 组
typescript
import { Elysia } from 'elysia'
new Elysia()
.get("/", () => "Hi")
.group("/auth", app => {
return app
.get("/", () => "Hi")
.post("/sign-in", ({ body }) => body)
.put("/sign-up", ({ body }) => body)
})
.listen(3000)
模式
强制路由的数据类型
参见 验证
typescript
import { Elysia, t } from 'elysia'
new Elysia()
.post('/mirror', ({ body: { username } }) => username, {
body: t.Object({
username: t.String(),
password: t.String()
})
})
.listen(3000)
生命周期钩子
按顺序拦截 Elysia 事件
参见 生命周期
typescript
import { Elysia, t } from 'elysia'
new Elysia()
.onRequest(() => {
console.log('On request')
})
.on('beforeHandle', () => {
console.log('Before handle')
})
.post('/mirror', ({ body }) => body, {
body: t.Object({
username: t.String(),
password: t.String()
}),
afterHandle: () => {
console.log("After handle")
}
})
.listen(3000)
守卫
强制子路由的数据类型
参见 范围
typescript
import { Elysia, t } from 'elysia'
new Elysia()
.guard({
response: t.String()
}, (app) => app
.get('/', () => 'Hi')
// 无效: 会抛出错误,并且 TypeScript 会报告错误
.get('/invalid', () => 1) )
.listen(3000)
自定义上下文
向路由上下文添加自定义变量
参见 上下文
typescript
import { Elysia } from 'elysia'
new Elysia()
.state('version', 1)
.decorate('getDate', () => Date.now())
.get('/version', ({
getDate,
store: { version }
}) => `${version} ${getDate()}`)
.listen(3000)
重定向
重定向响应
参见 处理器
typescript
import { Elysia } from 'elysia'
new Elysia()
.get('/', () => 'hi')
.get('/redirect', ({ redirect }) => {
return redirect('/')
})
.listen(3000)
插件
创建一个单独的实例
参见 插件
typescript
import { Elysia } from 'elysia'
const plugin = new Elysia()
.state('plugin-version', 1)
.get('/hi', () => 'hi')
new Elysia()
.use(plugin)
.get('/version', ({ store }) => store['plugin-version'])
.listen(3000)
Web Socket
使用 Web Socket 创建实时连接
参见 Web Socket
typescript
import { Elysia } from 'elysia'
new Elysia()
.ws('/ping', {
message(ws, message) {
ws.send('hello ' + message)
}
})
.listen(3000)
OpenAPI 文档
使用 Scalar (或可选的 Swagger) 创建交互式文档
参见 swagger
typescript
import { Elysia } from 'elysia'
import { swagger } from '@elysiajs/swagger'
const app = new Elysia()
.use(swagger())
.listen(3000)
console.log(`在浏览器中访问 "${app.server!.url}swagger" 查看文档`);
单元测试
编写 Elysia 应用的单元测试
参见 单元测试
typescript
// test/index.test.ts
import { describe, expect, it } from 'bun:test'
import { Elysia } from 'elysia'
describe('Elysia', () => {
it('返回响应', async () => {
const app = new Elysia().get('/', () => 'hi')
const response = await app
.handle(new Request('http://localhost/'))
.then((res) => res.text())
expect(response).toBe('hi')
})
})
自定义主体解析器
为解析主体创建自定义逻辑
参见 解析
typescript
import { Elysia } from 'elysia'
new Elysia()
.onParse(({ request, contentType }) => {
if (contentType === 'application/custom-type')
return request.text()
})
GraphQL
使用 GraphQL Yoga 或 Apollo 创建自定义 GraphQL 服务器
参见 GraphQL Yoga
typescript
import { Elysia } from 'elysia'
import { yoga } from '@elysiajs/graphql-yoga'
const app = new Elysia()
.use(
yoga({
typeDefs: /* GraphQL */`
type Query {
hi: String
}
`,
resolvers: {
Query: {
hi: () => 'Hello from Elysia'
}
}
})
)
.listen(3000)