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

将集成Prisma与MongoDB的Next.js项目部署到Vercel时遇错误求助

解决Next.js + Prisma + MongoDB部署到Vercel时构建失败(页面数据收集失败)的问题

可能的原因及对应解决步骤

1. MongoDB IP白名单限制Vercel访问

本地正常但部署失败的核心原因之一是MongoDB的IP白名单未放行Vercel服务器的IP地址。

解决步骤:

  • 登录MongoDB控制台,进入目标数据库集群的Network Access设置
  • 添加0.0.0.0/0(临时测试用,生产环境可配置Vercel IP范围或使用VPC peering)
  • 保存后重新触发Vercel部署

2. 构建阶段预渲染触发数据库连接失败

Next.js App Router的Server Component默认在构建阶段预渲染页面,此时Vercel构建环境可能因网络限制无法连接MongoDB,导致数据收集失败。

解决步骤:
在首页代码中添加动态渲染指令,将页面改为请求时渲染:

import prisma from '@/lib/prisma';

// 强制页面动态渲染,避免构建时执行数据库查询
export const dynamic = 'force-dynamic';

export default async function Home() {
  const courses = await prisma.course.findMany({
    select: {
      id: true,
      name: true,
    },
  });

  return (
    <main className="text-2xl">
      {courses.map((course) => (
        <p key={course.id}>{course.name}</p>
      ))}
    </main>
  );
}

3. Prisma Client生产环境生成异常

尽管配置了postinstall脚本,仍需确认Vercel构建时正确执行了prisma generate。

解决步骤:

  • 检查Vercel构建日志,确认postinstall阶段是否执行了prisma generate
  • 若未执行,修改package.json脚本:
"scripts": {
  "postinstall": "prisma generate --no-engine"
}

--no-engine参数避免下载不必要的数据库引擎(MongoDB无需Prisma Engine)

  • 重新部署项目

4. Prisma Client实例化优化(预防生产环境连接泄漏)

当前实例化代码在生产环境未缓存Prisma Client,虽不直接导致构建失败,但会引发生产环境连接问题,建议优化:

import { PrismaClient } from '@prisma/client';

const prismaClientSingleton = () => {
  return new PrismaClient();
};

declare const globalThis: {
  prismaGlobal: ReturnType<typeof prismaClientSingleton>;
} & typeof global;

// 全局缓存Prisma实例,避免重复创建连接
const prisma = globalThis.prismaGlobal ?? prismaClientSingleton();

export default prisma;

if (!globalThis.prismaGlobal) globalThis.prismaGlobal = prisma;

验证流程

  1. 完成上述调整后,重新触发Vercel部署
  2. 查看构建日志,确认无Failed to collect page data错误
  3. 访问部署后的页面,确认数据正常加载

内容的提问来源于stack exchange,提问作者Bahaa Aldein

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 14:14:56