使用T3 Stack+trpc-openapi+MongoDB时遇prisma未定义错误求助
问题排查与解决
核心原因
错误{"message":"Cannot read properties of undefined (reading 'prisma')","code":"INTERNAL_SERVER_ERROR"}的本质是:你的tRPC路由处理函数中尝试访问ctx.prisma,但上下文(context)对象里的prisma实例未被正确注入或初始化。
具体修复步骤
检查tRPC上下文配置
打开src/server/trpc/context.ts,确认已正确引入并注入Prisma客户端:import { prisma } from "@/server/db"; import { type CreateNextContextOptions } from "@trpc/server/adapters/next"; export const createTRPCContext = async (opts: CreateNextContextOptions) => { return { prisma, // 必须确保这里导出了prisma实例 ...opts, }; };同时确认
src/server/db.ts中正确初始化并导出Prisma客户端:import { PrismaClient } from "@prisma/client"; export const prisma = new PrismaClient({ log: ["query"], // 可选,用于调试查询 });验证trpc-openapi的上下文传递
打开你的openapi配置文件(通常是src/server/api/openapi.ts),确认初始化OpenApiRouter时传入了正确的上下文创建函数:import { OpenApiRouter } from "trpc-openapi"; import { appRouter } from "./root"; import { createTRPCContext } from "./trpc/context"; export const openApiRouter = OpenApiRouter.create({ router: appRouter, createContext: createTRPCContext, // 这里必须传入正确的上下文函数 });检查/api/all路由的实现
确认路由处理函数中是从ctx对象获取prisma,而非直接使用未定义的变量:// 示例路由定义 export const appRouter = createTRPCRouter({ all: publicProcedure .input(z.void()) .query(async ({ ctx }) => { // 必须使用ctx.prisma,不能直接写prisma(除非全局导入,但不推荐) return ctx.prisma.yourCollection.findMany(); }), });重启开发服务器
修改配置后重启Next.js服务,避免缓存导致配置未生效。
额外验证点
- 再次确认
.env文件中的DATABASE_URL配置正确,确保Prisma与MongoDB的连接无异常。 - 检查tRPC的API路由适配器文件(如
src/app/api/trpc/[trpc]/route.ts或src/pages/api/trpc/[trpc].ts),确认其使用的是createTRPCContext来创建上下文。
内容的提问来源于stack exchange,提问作者Vineet Bhatia
相关产品推荐
相关产品推荐

