From f38867c548b88af791873a709bc55858479edb95 Mon Sep 17 00:00:00 2001 From: imbytecat Date: Sun, 18 Jan 2026 03:03:28 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E5=AE=9E=E4=BE=8B=E7=AE=A1=E7=90=86=EF=BC=8C?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=8C=89=E9=9C=80=E5=88=9B=E5=BB=BA=E4=B8=8E?= =?UTF-8?q?=E4=B8=8A=E4=B8=8B=E6=96=87=E6=B3=A8=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除默认导出的 db 实例,改为按需创建数据库实例 - 使用数据库中间件提供上下文中的数据库实例,统一通过上下文获取数据库连接并执行操作。 - 添加数据库中间件以在请求上下文中注入数据库实例,支持服务器端全局缓存和无服务器环境下的每次新建实例。 - 导出中间件模块中的数据库相关功能。 --- src/db/index.ts | 2 -- src/orpc/handlers/todo.ts | 24 ++++++++++++++---------- src/orpc/middlewares/db.ts | 29 +++++++++++++++++++++++++++++ src/orpc/middlewares/index.ts | 1 + 4 files changed, 44 insertions(+), 12 deletions(-) create mode 100644 src/orpc/middlewares/db.ts create mode 100644 src/orpc/middlewares/index.ts diff --git a/src/db/index.ts b/src/db/index.ts index 34e985c..4da3faa 100644 --- a/src/db/index.ts +++ b/src/db/index.ts @@ -11,5 +11,3 @@ export function createDb() { schema, }) } - -export const db = createDb() diff --git a/src/orpc/handlers/todo.ts b/src/orpc/handlers/todo.ts index 2f7a92d..fc12752 100644 --- a/src/orpc/handlers/todo.ts +++ b/src/orpc/handlers/todo.ts @@ -6,8 +6,8 @@ import { createUpdateSchema, } from 'drizzle-zod' import { z } from 'zod' -import { db } from '@/db' import { todoTable } from '@/db/schema' +import { dbProvider } from '../middlewares' const selectSchema = createSelectSchema(todoTable) @@ -26,8 +26,9 @@ const updateSchema = createUpdateSchema(todoTable).omit({ export const list = os .input(z.void()) .output(z.array(selectSchema)) - .handler(async () => { - const todos = await db.query.todoTable.findMany({ + .use(dbProvider) + .handler(async ({ context }) => { + const todos = await context.db.query.todoTable.findMany({ orderBy: (todos, { desc }) => [desc(todos.createdAt)], }) return todos @@ -36,10 +37,11 @@ export const list = os export const create = os .input(insertSchema) .output(selectSchema) - .handler(async ({ input }) => { - const [newTodo] = await db + .use(dbProvider) + .handler(async ({ context, input }) => { + const [newTodo] = await context.db .insert(todoTable) - .values({ title: input.title }) + .values(input) .returning() if (!newTodo) { @@ -57,8 +59,9 @@ export const update = os }), ) .output(selectSchema) - .handler(async ({ input }) => { - const [updatedTodo] = await db + .use(dbProvider) + .handler(async ({ context, input }) => { + const [updatedTodo] = await context.db .update(todoTable) .set(input.data) .where(eq(todoTable.id, input.id)) @@ -78,6 +81,7 @@ export const remove = os }), ) .output(z.void()) - .handler(async ({ input }) => { - await db.delete(todoTable).where(eq(todoTable.id, input.id)) + .use(dbProvider) + .handler(async ({ context, input }) => { + await context.db.delete(todoTable).where(eq(todoTable.id, input.id)) }) diff --git a/src/orpc/middlewares/db.ts b/src/orpc/middlewares/db.ts new file mode 100644 index 0000000..01d55ce --- /dev/null +++ b/src/orpc/middlewares/db.ts @@ -0,0 +1,29 @@ +import { os } from '@orpc/server' +import { createDb } from '@/db' + +const IS_SERVERLESS = false // TODO: 这里需要优化 + +let globalDb: ReturnType | null = null + +function getDb() { + if (IS_SERVERLESS) { + return createDb() + } + + if (!globalDb) { + globalDb = createDb() + } + + return globalDb +} + +export const dbProvider = os.middleware(async ({ context, next }) => { + const db = getDb() + + return next({ + context: { + ...context, + db, + }, + }) +}) diff --git a/src/orpc/middlewares/index.ts b/src/orpc/middlewares/index.ts new file mode 100644 index 0000000..1beb455 --- /dev/null +++ b/src/orpc/middlewares/index.ts @@ -0,0 +1 @@ +export * from './db'