Skip to content

Bun Hono 后端 API

HaloLight Bun 后端 API 基于 Bun + Hono + Drizzle ORM 构建,提供超高性能后端服务。

API 文档https://halolight-api-bun.h7ml.cn/docs

GitHubhttps://github.com/halolight/halolight-api-bun

特性

  • 🔐 JWT 双令牌 - Access Token + Refresh Token,自动续期
  • 🛡️ RBAC 权限 - 基于角色的访问控制,通配符匹配
  • 📡 RESTful API - 标准化接口设计,OpenAPI 文档
  • 🗄️ Drizzle ORM - 类型安全的数据库操作
  • 数据验证 - 请求参数校验,错误处理
  • 📊 日志系统 - 请求日志,错误追踪
  • 🐳 Docker 支持 - 容器化部署
  • 极速性能 - 比 Node.js 快 4 倍

技术栈

技术版本说明
Bun1.1+运行时
Hono4.xWeb 框架
Drizzle ORM0.36+数据库 ORM
PostgreSQL15+数据存储
Zod3.x数据验证
JWT-身份认证
Swagger-API 文档

快速开始

环境要求

  • Bun >= 1.1
  • pnpm >= 8.0
  • PostgreSQL (可选,默认 SQLite)

安装

bash
# 克隆仓库
git clone https://github.com/halolight/halolight-api-bun.git
cd halolight-api-bun

# 安装依赖
pnpm install

环境变量

bash
cp .env.example .env
env
# 数据库
DATABASE_URL=postgresql://user:password@localhost:5432/halolight

# JWT 密钥
JWT_SECRET=your-super-secret-key
JWT_ACCESS_EXPIRES=15m
JWT_REFRESH_EXPIRES=7d

# 服务配置
PORT=3002
NODE_ENV=development
CORS_ORIGIN=http://localhost:3000
API_PREFIX=/api

数据库初始化

bash
bun run db:push
bun run db:seed

启动服务

bash
# 开发模式
bun run dev

# 生产模式
bun run build
bun run start

访问 http://localhost:3002

项目结构

halolight-api-bun/
├── src/
│   ├── routes/          # 控制器/路由处理
│   ├── services/        # 业务逻辑层
│   ├── db/              # 数据模型
│   ├── middleware/      # 中间件
│   ├── utils/           # 工具函数
│   └── index.ts         # 应用入口
├── test/                # 测试文件
├── Dockerfile           # Docker 配置
├── docker-compose.yml
└── package.json

API 模块

认证相关端点

方法路径描述权限
POST/api/auth/login用户登录公开
POST/api/auth/register用户注册公开
POST/api/auth/refresh刷新令牌公开
POST/api/auth/logout退出登录需认证
POST/api/auth/forgot-password忘记密码公开
POST/api/auth/reset-password重置密码公开

用户管理端点

方法路径描述权限
GET/api/users获取用户列表users:view
GET/api/users/:id获取用户详情users:view
POST/api/users创建用户users:create
PUT/api/users/:id更新用户users:update
DELETE/api/users/:id删除用户users:delete
GET/api/users/me获取当前用户需认证

完整端点清单

文档管理 (Documents) - 5 个端点

方法路径描述
GET/api/documents获取文档列表
GET/api/documents/:id获取文档详情
POST/api/documents创建文档
PUT/api/documents/:id更新文档
DELETE/api/documents/:id删除文档

文件管理 (Files) - 5 个端点

方法路径描述
GET/api/files获取文件列表
GET/api/files/:id获取文件详情
POST/api/files/upload上传文件
PUT/api/files/:id更新文件信息
DELETE/api/files/:id删除文件

消息管理 (Messages) - 5 个端点

方法路径描述
GET/api/messages获取消息列表
GET/api/messages/:id获取消息详情
POST/api/messages发送消息
PUT/api/messages/:id/read标记已读
DELETE/api/messages/:id删除消息

通知管理 (Notifications) - 4 个端点

方法路径描述
GET/api/notifications获取通知列表
PUT/api/notifications/:id/read标记已读
PUT/api/notifications/read-all全部已读
DELETE/api/notifications/:id删除通知

日历管理 (Calendar) - 5 个端点

方法路径描述
GET/api/calendar/events获取日程列表
GET/api/calendar/events/:id获取日程详情
POST/api/calendar/events创建日程
PUT/api/calendar/events/:id更新日程
DELETE/api/calendar/events/:id删除日程

仪表盘 (Dashboard) - 6 个端点

方法路径描述
GET/api/dashboard/stats统计数据
GET/api/dashboard/visits访问趋势
GET/api/dashboard/sales销售数据
GET/api/dashboard/pie饼图数据
GET/api/dashboard/tasks待办任务
GET/api/dashboard/calendar今日日程

认证机制

JWT 双令牌

Access Token:  15 分钟有效期,用于 API 请求
Refresh Token: 7 天有效期,用于刷新 Access Token

请求头

http
Authorization: Bearer <access_token>

刷新流程

typescript
// 刷新令牌示例
const response = await fetch('/api/auth/refresh', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    refreshToken: 'your_refresh_token'
  })
});

const { accessToken, refreshToken } = await response.json();

权限系统

角色定义

角色说明权限
super_admin超级管理员* (所有权限)
admin管理员users:*, documents:*, ...
user普通用户documents:view, files:view, ...
guest访客dashboard:view

权限格式

{resource}:{action}

示例:
- users:view      # 查看用户
- users:create    # 创建用户
- users:*         # 用户所有操作
- *               # 所有权限

错误处理

错误响应格式

json
{
  "success": false,
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "请求参数验证失败",
    "details": [
      { "field": "email", "message": "邮箱格式不正确" }
    ]
  }
}

错误码

状态码错误码说明
400VALIDATION_ERROR参数验证失败
401UNAUTHORIZED未授权
403FORBIDDEN无权限
404NOT_FOUND资源不存在
409CONFLICT资源冲突
500INTERNAL_ERROR服务器错误

常用命令

bash
# 开发
bun run dev                 # 启动开发服务器
bun run build               # 生产构建
bun run start               # 运行生产版本

# 构建
bun run build               # 构建生产版本

# 测试
bun test                    # 运行单元测试
bun test --coverage         # 生成覆盖率报告

# 数据库
bun run db:push             # 推送 Schema 到数据库
bun run db:generate         # 生成迁移文件
bun run db:migrate          # 运行数据库迁移
bun run db:seed             # 填充测试数据
bun run db:studio           # 打开 Drizzle Studio

# 代码质量
bun run lint                # ESLint 检查
bun run lint:fix            # ESLint 自动修复
bun run type-check          # TypeScript 类型检查

部署

Docker

bash
docker build -t halolight-api-bun .
docker run -p 3002:3002 halolight-api-bun

Docker Compose

bash
docker-compose up -d
yaml
# docker-compose.yml
version: '3.8'

services:
  app:
    build: .
    ports:
      - "3002:3002"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=${DATABASE_URL}
      - JWT_SECRET=${JWT_SECRET}
    restart: unless-stopped

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: halolight
      POSTGRES_USER: ${DB_USER}
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

生产环境配置

env
NODE_ENV=production
DATABASE_URL=postgresql://user:pass@host:5432/db
JWT_SECRET=your-production-secret

测试

运行测试

bash
bun test                    # 运行所有测试
bun test --coverage         # 生成覆盖率报告

测试示例

typescript
// 认证测试示例
import { describe, test, expect } from 'bun:test';

describe('Auth API', () => {
  test('should login successfully', async () => {
    const response = await fetch('http://localhost:3002/api/auth/login', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        email: 'admin@example.com',
        password: 'admin123'
      })
    });

    const data = await response.json();
    expect(data.success).toBe(true);
    expect(data.data.accessToken).toBeDefined();
  });
});

性能指标

基准测试

指标数值说明
请求吞吐量~50,000 req/s单核,简单路由
平均响应时间<5ms本地数据库
内存占用~30MB冷启动
CPU 使用率<10%空闲状态

可观测性

日志系统

typescript
// 日志配置示例
import { logger } from './utils/logger';

logger.info('User logged in', { userId: user.id });
logger.error('Database error', { error: err.message });

健康检查

typescript
// GET /health
app.get('/health', (c) => {
  return c.json({
    status: 'healthy',
    timestamp: new Date().toISOString(),
    uptime: process.uptime()
  });
});

监控指标

typescript
// Prometheus metrics 端点
app.get('/metrics', async (c) => {
  return c.text(await register.metrics());
});

常见问题

Q:如何配置数据库连接?

A:在 .env 文件中设置 DATABASE_URL

env
DATABASE_URL=postgresql://user:password@localhost:5432/halolight

Q:如何使用 Bun 内置密码哈希?

A:使用 Bun.password API:

typescript
// 哈希密码
const hash = await Bun.password.hash(password, {
  algorithm: 'bcrypt',
  cost: 10
});

// 验证密码
const isValid = await Bun.password.verify(password, hash, 'bcrypt');

开发工具

推荐插件/工具

  • Drizzle Studio - 可视化数据库管理工具
  • Hoppscotch/Postman - API 测试工具
  • ESLint + Prettier - 代码格式化
  • Bun VSCode Extension - Bun 语法支持

与其他后端对比

特性Bun + HonoNestJSFastAPISpring Boot
语言TypeScriptTypeScriptPythonJava
ORMDrizzlePrismaSQLAlchemyJPA
性能⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
学习曲线⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

相关链接