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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:01:27