既然你准备好了,那我们就来实战一下! 接下来的这个示例将展示 Bun + ElysiaJS 的强大之处。ElysiaJS 是目前 Bun 生态中性能最强、且对 TypeScript 支持最完美的 Web 框架(类似于 Express 或 Fastify,但速度快得多)。 我们将构建一个简单的 API,它不仅能处理请求,还能自动进行参数校验和类型推导。 🚀 实战:构建第一个 Bun + ElysiaJS 高性能 API
-
初始化项目 打开终端,执行以下命令: mkdir bun-api-demo cd bun-api-demo bun init -y # 快速初始化,跳过问答 bun add elysia # 安装 Elysia 框架
-
编写服务器代码 (src/index.ts) 创建一个 src 文件夹并在其中创建 index.ts。 Elysia 的神奇之处在于它内置了名为 t 的模式验证库。通过它,你定义了验证规则后,TypeScript 的类型定义也就自动生成了。 // src/index.ts import { Elysia, t } from ‘elysia’;
const app = new Elysia() // 1. 基础路由:Hello World .get(’/’, () => ‘Hello from Bun + Elysia! 🦊’)
// 2. 带参数和校验的路由
// 我们要求:id 必须是数字,query 中必须包含 name
.get(‘/user/:id’, ({ params: { id }, query: { name } }) => {
// 这里不需要写类型注解,TS 自动知道 id 是 number, name 是 string
return {
id,
name,
message: User ${name} has ID: ${id},
timestamp: Date.now()
};
}, {
// 校验层(Schema Validation)
params: t.Object({
id: t.Numeric() // 自动将字符串转换为数字,并校验
}),
query: t.Object({
name: t.String()
})
})
// 3. POST 请求示例 .post(‘/login’, ({ body }) => { return { status: ‘success’, user: body.username }; }, { body: t.Object({ username: t.String(), password: t.String() }) })
.listen(3000);
console.log(🦊 Elysia is running at ${app.server?.hostname}:${app.server?.port});
// 导出类型,供前端或测试客户端使用(这是 Elysia 的杀手级特性) export type App = typeof app;
- 运行服务器 在终端运行: bun —watch src/index.ts
现在你可以打开浏览器访问 http://localhost:3000/user/123?name=Gemini,你会看到返回的 JSON 数据。如果把 123 改成 abc,服务器会自动返回 400 错误,告诉你参数验证失败。 ✨ 为什么这是“最佳实践”? (Elysia 的魔法) 如果你在这个项目中再创建一个客户端文件(比如 client.ts)来调用刚才的 API,你会看到惊人的效果: 安装客户端工具: bun add @elysiajs/eden
编写客户端代码 (client.ts): import { edenTreaty } from ‘@elysiajs/eden’; import type { App } from ’./src/index’; // 导入刚才导出的类型
// 1. 初始化客户端,绑定后端类型
const api = edenTreaty
// 2. 调用接口 // 注意:当你输入 .get 时,IDE 会自动提示 /user/:id // 当你输入 query 时,IDE 会提示必须传 name const { data, error } = await api.user[123].get({ $query: { name: “BunDeveloper” } });
if (error) { console.error(error); } else { // 这里 data 的类型已经被完全推导出来了! // 不需要手动定义 interface UserResponse… console.log(data.message); }
核心价值: 后端写好验证逻辑,前端(或客户端)自动获得类型提示。这消除了前后端联调中 90% 的类型不匹配错误。
✅ 接下来我可以为你做什么? 现在的 API 还是静态数据的。为了让它成为一个完整的后端应用,我们通常需要连接数据库。 你想了解如何将 Bun 与 SQLite(使用 Drizzle ORM)集成,从而实现数据的持久化存储吗?这是目前开发体验最好的组合。