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 时无法正常工作。

您可以像对待普通的 Expo API 路由那样对待 Elysia 服务器。

pnpm

如果您使用 pnpm,pnpm 默认不自动安装 peer dependencies,这会迫使您手动安装额外的依赖项。

bash
pnpm add @sinclair/typebox openapi-types

前缀

如果您将 Elysia 服务器放置在应用路由的根目录之外,您需要为 Elysia 服务器注释前缀。

有关更多信息,请参考 API 路由

例如,如果您将 Elysia 服务器放在 app/api/[...slugs]+api.ts 中,您需要将前缀注释为 /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 '@elysiajs/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 应用创建优化构建,这将包括一个使用 Elysia 的 Expo 函数,位于 dist/server/_expo/functions/[...slugs]+api.js

TIP

请注意,Expo 函数被视为边缘函数,而不是普通服务器,因此直接运行边缘函数不会分配任何端口。

您可以使用 Expo 提供的 Expo 函数适配器来部署您的边缘函数。

目前 Expo 支持以下适配器: