Skip to content
在 AI 工具中打开 Anthropic

与 Expo 集成

从 Expo SDK 50 和 App Router v3 开始,Expo 允许我们直接在 Expo 应用中创建 API 路由。

  1. 创建 app/[...slugs]+api.ts
  2. 定义一个 Elysia 服务器
  3. 用你想使用的 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 的端到端类型安全

  1. 从 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
  1. 创建 Treaty 客户端
typescript
import { treaty } from '@elysia/eden'
import type { app } from '../app/[...slugs]+api'

export const api = treaty<app>('localhost:3000/api')
  1. 在服务端和客户端组件中使用该客户端
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 支持以下适配器: