Eden 条约
Eden 条约是用于与服务器交互的对象表示,具备类型安全、自动补全和错误处理功能。
要使用 Eden 条约,首先导出你现有的 Elysia 服务器的类型:
typescript
// server.ts
import { Elysia, t } from 'elysia'
const app = new Elysia()
.get('/hi', () => '你好 Elysia')
.get('/id/:id', ({ params: { id } }) => id)
.post('/mirror', ({ body }) => body, {
body: t.Object({
id: t.Number(),
name: t.String()
})
})
.listen(3000)
export type App = typeof app // [!代码 ++]然后导入服务器类型并在客户端使用 Elysia API:
typescript
// @filename: server.ts
import { Elysia, t } from 'elysia'
const app = new Elysia()
.get('/hi', () => '你好 Elysia')
.get('/id/:id', ({ params: { id } }) => id)
.post('/mirror', ({ body }) => body, {
body: t.Object({
id: t.Number(),
name: t.String()
})
})
.listen(3000)
export type App = typeof app // [!代码 ++]
// @filename: client.ts
// ---cut---
// client.ts
import { treaty } from '@elysia/eden'
import type { App } from './server'
const app = treaty<App>('localhost:3000')
// 响应类型: '你好 Elysia'
const { data, error } = await app.hi.get()
// ^?树状语法
HTTP 路径是文件系统树的资源指示符。
文件系统由多个层级的文件夹组成,例如:
- /documents/elysia
- /documents/kalpas
- /documents/kelvin
每个层级由 /(斜杠)和一个名称分隔。
然而,在 JavaScript 中,我们不是用 "/"(斜杠)而是用 "."(点)来访问更深层的资源。
Eden 条约将 Elysia 服务器转化为一个树状文件系统,可以从 JavaScript 前端进行访问。
| 路径 | 条约 |
|---|---|
| / | |
| /hi | .hi |
| /deep/nested | .deep.nested |
结合 HTTP 方法,我们可以与 Elysia 服务器进行交互。
| 路径 | 方法 | 条约 |
|---|---|---|
| / | GET | .get() |
| /hi | GET | .hi.get() |
| /deep/nested | GET | .deep.nested.get() |
| /deep/nested | POST | .deep.nested.post() |
动态路径
然而,仅用符号无法表达动态路径参数。如果完全替换它们,我们就不知道这个参数名应该是什么。
typescript
// ❌ 不清楚这个值应该表示什么?
treaty.item['skadi'].get()为了解决这个问题,我们可以用函数指定动态路径,以提供键值。
typescript
// ✅ 清晰说明该值是动态的,路径是 'name'
treaty.item({ name: 'Skadi' }).get()| 路径 | 条约 |
|---|---|
| /item | .item |
| /item/:name | .item({ name: 'Skadi' }) |
| /item/:name/id | .item({ name: 'Skadi' }).id |