You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 05:55:22