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);
性能考虑
- 连接池:SQLite 是单文件数据库,不需要连接池
- 查询优化:使用 prepared statements 防止 SQL 注入
- 索引:为频繁查询的字段添加索引
- 缓存:对不经常变化的数据使用缓存
部署
Hono 可以部署到多个平台:
- Node.js VPS:传统的 VPS 部署
- Cloudflare Workers:无服务器部署
- Deno Deploy:Deno 官方平台
- Railway / Render:PaaS 平台
对于我的项目,选择部署到 VPS,用 PM2 管理进程,Nginx 反向代理。
最佳实践
- 将业务逻辑从路由中分离出来
- 使用中间件处理通用功能(鉴权、日志、错误处理)
- 数据库操作使用 prepared statements
- 返回统一的 API 响应格式
这个组合足以应对大多数个人项目和小型应用的需求。