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 { 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,
},
})
})
}),
)
+5 -20
View File
@@ -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<typeof createDB>
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
+2 -3
View File
@@ -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)
}