与 Expo 集成
从 Expo SDK 50 和 App Router v3 开始,Expo 允许我们直接在 Expo 应用中创建 API 路由。
- 创建 app/[...slugs]+api.ts
- 定义一个 Elysia 服务器
- 用你想使用的 HTTP 方法名称导出 Elysia.fetch
typescript
import { Elysia, t } from 'elysia'
const app = new Elysia()
.get('/', 'hello Expo')
.post('/', ({ body }) => body, {
body: t.Object({
name: t.String()
})
})
export const GET = app.fetch
export const POST = app.fetch Elysia 将正常运行,因为得益于 WinterCG 的兼容性,然而,某些插件如 Elysia Static 可能在您在 Node 上运行 Expo 时无法正常工作。
您可以将 Elysia 服务器视为普通的 Expo API 路由。
pnpm
如果您使用 pnpm,pnpm 默认不自动安装 peer dependencies,这会迫使您手动安装额外的依赖项。
bash
pnpm add @sinclair/typebox openapi-types前缀
如果您将 Elysia 服务器放置在 app router 的根目录之外,您需要在 Elysia 服务器上注解前缀。
例如,如果您将 Elysia 服务器放置在 app/api/[...slugs]+api.ts,则需要在 Elysia 服务器上注解前缀为 /api。
typescript
import { Elysia, t } from 'elysia'
const app = new Elysia({ prefix: '/api' })
.get('/', 'Hello Expo')
.post('/', ({ body }) => body, {
body: t.Object({
name: t.String()
})
})
export const GET = app.fetch
export const POST = app.fetch这将确保无论您将其放在哪里,Elysia 路由都能正常工作。
Eden
我们可以添加 Eden 实现类似 tRPC 的端到端类型安全。
- 从 Elysia 服务器导出
type
typescript
import { Elysia } from 'elysia'
const app = new Elysia()
.get('/', 'Hello Nextjs')
.post(
'/user',
({ body }) => body,
{
body: treaty.schema('User', {
name: 'string'
})
}
)
export type app = typeof app
export const GET = app.fetch
export const POST = app.fetch- 创建 Treaty 客户端
typescript
import { treaty } from '@elysia/eden'
import type { app } from '../app/[...slugs]+api'
export const api = treaty<app>('localhost:3000/api')- 在服务端和客户端组件中使用该客户端
tsx
import { api } from '../lib/eden'
export default async function Page() {
const message = await api.get()
return <h1>Hello, {message}</h1>
}部署
您可以直接使用带有 Elysia 的 API 路由并根据需要作为普通 Elysia 应用部署,或者使用 实验性质的 Expo 服务器运行时。
如果您使用 Expo 服务器运行时,可以使用 expo export 命令为您的 Expo 应用创建优化后的构建。这将包括一个在 dist/server/_expo/functions/[...slugs]+api.js 位置使用 Elysia 的 Expo 函数。
TIP
请注意,Expo 函数被视为 Edge 函数而非普通服务器,因此直接运行 Edge 函数不会分配任何端口。
您可以使用 Expo 提供的 Expo 函数适配器来部署您的边缘函数。
目前,Expo 支持以下适配器: