You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hono中间件中使用带withAccelerate扩展的Prisma Client遇TypeScript错误

在Hono中全局绑定带withAccelerate扩展的Prisma Client(解决TypeScript类型不匹配问题)

问题根源

你遇到的类型错误本质是:withAccelerate 扩展会返回增强后的Prisma Client实例,其类型并非原始的PrismaClient,直接用PrismaClient作为Hono Variables中prisma字段的类型自然会出现不匹配。

解决方案

1. 定义扩展后的Prisma Client类型

创建单独的Prisma工具文件(如lib/prisma.ts),统一管理带扩展的实例和对应类型:

// lib/prisma.ts
import { PrismaClient } from '@prisma/client'
import { withAccelerate } from '@prisma/extension-accelerate'

// 仅创建一次带Accelerate扩展的实例(符合Prisma最佳实践)
export const prisma = new PrismaClient().$extends(withAccelerate())

// 导出扩展后的实例类型,用于Hono Variables声明
export type ExtendedPrismaClient = typeof prisma

2. 配置Hono全局变量类型

在Hono主入口文件(如index.ts)中,声明全局Variables类型,指定prisma字段为扩展后的类型:

// index.ts
import { Hono } from 'hono'
import type { ExtendedPrismaClient } from './lib/prisma'
import { prisma } from './lib/prisma'

// 声明Hono应用的全局变量类型
type AppVariables = {
  prisma: ExtendedPrismaClient
}

// 初始化Hono应用并绑定变量类型
const app = new Hono<{ Variables: AppVariables }>()

3. 全局中间件挂载Prisma实例

添加全局中间件,将预创建的Prisma实例绑定到上下文,所有路由均可复用:

// 全局中间件:将Prisma实例注入上下文
app.use('*', async (ctx, next) => {
  ctx.set('prisma', prisma)
  await next()
})

4. 路由中使用上下文的Prisma实例

在各路由文件(如api/v1/user/index.ts)中,直接从上下文获取prisma,TypeScript会自动推断正确类型:

// api/v1/user/index.ts
import { Hono } from 'hono'
import type { AppVariables } from '../../index'

const userRouter = new Hono<{ Variables: AppVariables }>()

userRouter.get('/', async (ctx) => {
  const users = await ctx.get('prisma').user.findMany()
  return ctx.json(users)
})

export default userRouter

额外提示

  • 不要在请求周期内重复创建Prisma实例:上述方案中实例仅在模块顶层创建一次,全局复用,避免性能损耗。
  • 适配Cloudflare Workers环境:如果用Wrangler部署,withAccelerate已经适配Serverless环境,无需额外调整实例初始化逻辑。

内容的提问来源于stack exchange,提问作者Rishikesh Solapure

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 05:25:08