Skip to content

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
// client.ts
import { 
treaty
} from '@elysiajs/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 前端访问的树状文件系统。

路径条约
/.index
/hi.hi
/deep/nested.deep.nested

结合 HTTP 方法,我们可以与 Elysia 服务器进行交互。

路径方法条约
/GET.index.get()
/hiGET.hi.get()
/deep/nestedGET.deep.nested.get()
/deep/nestedPOST.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