如何在Hono/Bun应用中基于Drizzle ORM等待数据库连接?
如何在Bun+Hono中等待Drizzle数据库连接建立后再启动服务器
问题场景
使用Hono、Drizzle和Bun搭建Web服务器时,当前服务器会直接启动,不会等待数据库连接建立完成。希望实现类似Express中mongoose.connect(...).then(() => app.listen(...))的效果,确保数据库连接成功后再启动服务。
解决方案
postgres.js(Drizzle依赖的PostgreSQL客户端)默认采用懒加载连接,只有在执行第一个查询时才会建立数据库连接。我们可以主动触发一个测试查询来验证连接状态,待连接成功后再启动Hono服务器。
步骤1:添加数据库连接测试函数
修改src/db/index.ts,新增一个用于验证数据库连接的异步函数:
import { drizzle } from "drizzle-orm/postgres-js"; import postgres from "postgres"; const queryClient = postgres(process.env.DB_URL as string); const db = drizzle(queryClient); // 测试数据库连接是否正常 export async function testDbConnection() { try { // 执行简单查询强制建立连接并验证 await queryClient`SELECT 1`; console.log("✅ 数据库连接成功"); } catch (err) { console.error("❌ 数据库连接失败", err); throw err; // 抛出错误,阻止服务器启动 } } export { db };
步骤2:修改服务器启动逻辑
修改src/index.ts,不再直接导出Hono实例,而是编写启动函数,先验证数据库连接,再启动服务器:
import { Hono } from "hono"; import UserRepo from "./repo/UserRepo"; import { testDbConnection } from "./db"; const app = new Hono(); app.get("/ping", (c) => { return c.text("pong"); }); app.post("/user", async (c) => { const { name, email } = await c.req.json(); const newUser = await UserRepo.create({ name, email }); return c.json(newUser, 201); }); app.onError((err, c) => { console.log(err); return c.json(err, 500); }); // 异步启动服务器 async function startServer() { try { // 先等待数据库连接验证通过 await testDbConnection(); const port = process.env.PORT || 3000; // 使用Bun.serve启动Hono服务 Bun.serve({ fetch: app.fetch, port, }); console.log(`🚀 服务器已启动,监听端口 ${port}`); } catch (err) { console.error("💥 服务器启动失败", err); process.exit(1); // 连接失败时退出进程 } } // 执行启动流程 startServer();
原理说明
通过主动执行SELECT 1查询,强制postgres.js立即建立数据库连接并验证可用性。只有当连接成功后,才会调用Bun.serve启动Hono服务器,完全复刻了Express中等待数据库连接完成再启动服务的逻辑。
内容的提问来源于stack exchange,提问作者Ahmed Sadman Muhib
相关产品推荐
相关产品推荐

