与 Astro 的集成
使用 Astro Endpoint,我们可以直接在 Astro 上运行 Elysia。
- 在 astro.config.mjs 中将 output 设置为 server
javascript
// astro.config.mjs
import { defineConfig } from 'astro/config'
// https://astro.build/config
export default defineConfig({
output: 'server'
})- 创建 pages/[...slugs].ts
- 在 [...slugs].ts 中创建或导入一个已存在的 Elysia 服务器
- 导出你想暴露的方法名的处理程序
typescript
// pages/[...slugs].ts
import { Elysia, t } from 'elysia'
const app = new Elysia()
.get('/api', () => 'hi')
.post('/api', ({ body }) => body, {
body: t.Object({
name: t.String()
})
})
const handle = ({ request }: { request: Request }) => app.handle(request)
export const GET = handle
export const POST = handle Elysia 能够正常工作,因为遵循了 WinterTC。
我们推荐在 Bun 上运行 Astro,因为 Elysia 设计是为了在 Bun 上运行。
TIP
您可以在不使用 Bun 运行 Astro 的情况下运行 Elysia 服务器,这得益于 WinterTC 的支持。
但是如果您在 Node 上运行 Astro,某些插件如 Elysia Static 可能无法正常工作。
通过这种方式,您可以在单个代码库中共同拥有前端和后端,并且与 Eden 实现端到端的类型安全。
pnpm
如果您使用 pnpm,pnpm 默认不会自动安装 peer 依赖,这会要求您手动安装额外的依赖。
bash
pnpm add @sinclair/typebox openapi-types前缀
如果您将 Elysia 服务器放置在应用路由器的根目录之外,需要在 Elysia 服务器上标注前缀。
例如,如果您将 Elysia 服务器放置在 pages/api/[...slugs].ts,则需要在 Elysia 服务器上标注前缀为 /api。
typescript
// pages/api/[...slugs].ts
import { Elysia, t } from 'elysia'
const app = new Elysia({ prefix: '/api' })
.get('/', () => 'hi')
.post('/', ({ body }) => body, {
body: t.Object({
name: t.String()
})
})
const handle = ({ request }: { request: Request }) => app.handle(request)
export const GET = handle
export const POST = handle 这将确保无论您将其放置在哪里,Elysia 的路由都能正常工作。
更多信息请参考 Astro Endpoints。