SQLite + Hono:轻量级全栈实践

Hono SQLite Node.js

探索用 Hono 框架和 better-sqlite3 构建 RESTful API 的最佳实践,轻量、快速、易于部署。


Hono 是什么?

Hono 是一个轻量级、高性能的 Web 框架,类似于 Express,但更现代、更快。它支持多种运行时环境,包括 Node.js、Deno、Cloudflare Workers 等。

为什么选择 Hono + SQLite?

对于个人项目或小型应用,这个组合非常合适:

  • Hono:极简 API,快速路由,零依赖(核心)
  • SQLite:单文件数据库,无需额外的数据库服务,易于备份和迁移
  • better-sqlite3:同步 API,性能优秀,代码写起来很简洁

项目结构

backend/
├── src/
│   ├── routes/        # 路由定义
│   ├── handlers/      # 业务逻辑
│   ├── middleware/    # 中间件
│   └── lib/           # 工具函数
└── package.json

构建 API

基础路由

import { Hono } from 'hono';
import Database from 'better-sqlite3';

const app = new Hono();
const db = new Database('app.db');

// 初始化表
db.exec(`
  CREATE TABLE IF NOT EXISTS posts (
    id INTEGER PRIMARY KEY,
    title TEXT,
    content TEXT,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
  )
`);

// 获取所有文章
app.get('/posts', (c) => {
  const posts = db.prepare('SELECT * FROM posts').all();
  return c.json(posts);
});

// 创建文章
app.post('/posts', async (c) => {
  const { title, content } = await c.req.json();
  const stmt = db.prepare('INSERT INTO posts (title, content) VALUES (?, ?)');
  const result = stmt.run(title, content);
  return c.json({ id: result.lastInsertRowid });
});

export default app;

中间件和鉴权

// middleware/auth.ts
export const auth = async (c, next) => {
  const token = c.req.header('Authorization');
  if (!token) {
    return c.json({ error: 'Unauthorized' }, 401);
  }
  await next();
};

app.use('/api/admin/*', auth);

性能考虑

  1. 连接池:SQLite 是单文件数据库,不需要连接池
  2. 查询优化:使用 prepared statements 防止 SQL 注入
  3. 索引:为频繁查询的字段添加索引
  4. 缓存:对不经常变化的数据使用缓存

部署

Hono 可以部署到多个平台:

  • Node.js VPS:传统的 VPS 部署
  • Cloudflare Workers:无服务器部署
  • Deno Deploy:Deno 官方平台
  • Railway / Render:PaaS 平台

对于我的项目,选择部署到 VPS,用 PM2 管理进程,Nginx 反向代理。

最佳实践

  1. 将业务逻辑从路由中分离出来
  2. 使用中间件处理通用功能(鉴权、日志、错误处理)
  3. 数据库操作使用 prepared statements
  4. 返回统一的 API 响应格式

这个组合足以应对大多数个人项目和小型应用的需求。