refactor(db): 去掉 lazy singleton,改为模块级 const db

getDB/closeDB + 可空单例是 Cloudflare Workers 场景的模式——每个请求独
立上下文、不允许模块加载期副作用。在 Bun 单进程长驻服务下这些都是冗余
的仪式,徒增心智。

改为模块级 const db:
- src/server/db/index.ts 直接 export drizzle(...) 实例
- shutdown 插件用 db.$client.end() 收尾
- db.middleware.ts 跟随内部重命名以避免同名遮蔽(本身的去留放到下一
  次提交)
This commit is contained in:
2026-04-24 20:36:16 +08:00
parent f6b6edee23
commit d15b22ad1b
3 changed files with 13 additions and 29 deletions
+6 -6
View File
@@ -1,11 +1,11 @@
import { os } from '@/server/api/server' 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 }) => { export const db = os.middleware(async ({ context, next }) =>
return next({ next({
context: { context: {
...context, ...context,
db: getDB(), db: dbSingleton,
}, },
}) }),
}) )
+2 -17
View File
@@ -2,24 +2,9 @@ import { drizzle } from 'drizzle-orm/postgres-js'
import { env } from '@/env' import { env } from '@/env'
import * as schema from '@/server/db/schema' import * as schema from '@/server/db/schema'
export const createDB = () => export const db = drizzle({
drizzle({
connection: env.DATABASE_URL, connection: env.DATABASE_URL,
schema, schema,
}) })
export type DB = ReturnType<typeof createDB> export type DB = typeof db
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
}
}
+2 -3
View File
@@ -1,4 +1,4 @@
import { closeDB } from '@/server/db' import { db } from '@/server/db'
export default () => { export default () => {
if (import.meta.dev) return if (import.meta.dev) return
@@ -11,9 +11,8 @@ export default () => {
} }
exiting = true exiting = true
// Brief delay to let srvx close the HTTP server first
setTimeout(async () => { setTimeout(async () => {
await closeDB() await db.$client.end()
process.exit(0) process.exit(0)
}, 500) }, 500)
} }