forked from imbytecat/fullstack-starter
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:
@@ -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
@@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user