From d15b22ad1b45b811c6bdb90189a608be7954687a Mon Sep 17 00:00:00 2001 From: imbytecat Date: Fri, 24 Apr 2026 20:36:16 +0800 Subject: [PATCH] =?UTF-8?q?refactor(db):=20=E5=8E=BB=E6=8E=89=20lazy=20sin?= =?UTF-8?q?gleton=EF=BC=8C=E6=94=B9=E4=B8=BA=E6=A8=A1=E5=9D=97=E7=BA=A7=20?= =?UTF-8?q?const=20db?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit getDB/closeDB + 可空单例是 Cloudflare Workers 场景的模式——每个请求独 立上下文、不允许模块加载期副作用。在 Bun 单进程长驻服务下这些都是冗余 的仪式,徒增心智。 改为模块级 const db: - src/server/db/index.ts 直接 export drizzle(...) 实例 - shutdown 插件用 db.$client.end() 收尾 - db.middleware.ts 跟随内部重命名以避免同名遮蔽(本身的去留放到下一 次提交) --- src/server/api/middlewares/db.middleware.ts | 12 +++++----- src/server/db/index.ts | 25 +++++---------------- src/server/plugins/shutdown.ts | 5 ++--- 3 files changed, 13 insertions(+), 29 deletions(-) diff --git a/src/server/api/middlewares/db.middleware.ts b/src/server/api/middlewares/db.middleware.ts index d57afd2..77d5f9b 100644 --- a/src/server/api/middlewares/db.middleware.ts +++ b/src/server/api/middlewares/db.middleware.ts @@ -1,11 +1,11 @@ import { os } from '@/server/api/server' -import { getDB } from '@/server/db' +import { db as dbSingleton } from '@/server/db' -export const db = os.middleware(async ({ context, next }) => { - return next({ +export const db = os.middleware(async ({ context, next }) => + next({ context: { ...context, - db: getDB(), + db: dbSingleton, }, - }) -}) + }), +) diff --git a/src/server/db/index.ts b/src/server/db/index.ts index ea564c2..14db5da 100644 --- a/src/server/db/index.ts +++ b/src/server/db/index.ts @@ -2,24 +2,9 @@ import { drizzle } from 'drizzle-orm/postgres-js' import { env } from '@/env' import * as schema from '@/server/db/schema' -export const createDB = () => - drizzle({ - connection: env.DATABASE_URL, - schema, - }) +export const db = drizzle({ + connection: env.DATABASE_URL, + schema, +}) -export type DB = ReturnType - -let _db: DB | null = null - -export const getDB = (): DB => { - _db ??= createDB() - return _db -} - -export const closeDB = async () => { - if (_db) { - await _db.$client.end() - _db = null - } -} +export type DB = typeof db diff --git a/src/server/plugins/shutdown.ts b/src/server/plugins/shutdown.ts index 3e5d0cf..b402e5a 100644 --- a/src/server/plugins/shutdown.ts +++ b/src/server/plugins/shutdown.ts @@ -1,4 +1,4 @@ -import { closeDB } from '@/server/db' +import { db } from '@/server/db' export default () => { if (import.meta.dev) return @@ -11,9 +11,8 @@ export default () => { } exiting = true - // Brief delay to let srvx close the HTTP server first setTimeout(async () => { - await closeDB() + await db.$client.end() process.exit(0) }, 500) }