Skip to content
在 AI 工具中打开 Anthropic

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()
/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