49 lines
988 B
TypeScript
49 lines
988 B
TypeScript
/**
|
|
* 数据库中间件
|
|
*
|
|
* 为 ORPC 处理器提供数据库连接。使用单例模式管理连接,
|
|
* 避免每次请求都创建新连接。
|
|
*/
|
|
import { os } from '@orpc/server'
|
|
import { createDb, type Db } from '@/db'
|
|
|
|
/** 全局数据库实例 (单例模式) */
|
|
let globalDb: Db | null = null
|
|
|
|
/**
|
|
* 获取数据库实例
|
|
*
|
|
* 首次调用时创建连接,后续调用返回同一实例。
|
|
* 这种模式适合长时间运行的服务器进程。
|
|
*/
|
|
function getDb(): Db {
|
|
if (!globalDb) {
|
|
globalDb = createDb()
|
|
}
|
|
return globalDb
|
|
}
|
|
|
|
/**
|
|
* 数据库提供者中间件
|
|
*
|
|
* 使用方式:
|
|
* ```ts
|
|
* export const list = os.todo.list
|
|
* .use(dbProvider)
|
|
* .handler(async ({ context }) => {
|
|
* // context.db 可用
|
|
* return context.db.query.todoTable.findMany()
|
|
* })
|
|
* ```
|
|
*/
|
|
export const dbProvider = os.middleware(async ({ context, next }) => {
|
|
const db = getDb()
|
|
|
|
return next({
|
|
context: {
|
|
...context,
|
|
db,
|
|
},
|
|
})
|
|
})
|