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

Next.js 13构建时出现BSONTypeError问题求助

问题原因分析

出现这个错误的核心原因是Next.js构建静态页面时的预渲染机制与动态路由参数的冲突:

  • 本地运行时,你访问的是带有真实有效ObjectId的路径(比如/isomo/63e2b8ee59f3dd8e0ada240b),itemId参数是符合要求的24位十六进制字符串,所以new ObjectId(itemId)能正常执行。
  • 但构建阶段预渲染动态路由/isomo/[id]时,Next.js会尝试生成静态页面,此时如果没有通过generateStaticParams提供具体的有效id列表,它会传入一个无效的占位值(比如空字符串、默认占位符),这个值不符合MongoDB ObjectId的格式要求(必须是12字节字符串、24位十六进制字符串或整数),因此触发BSONTypeError。

另外,你的代码未对itemId做格式校验,一旦传入无效值就直接报错,这是问题暴露的直接诱因。

可行解决办法
  • 添加静态参数生成函数:在app/isomo/[id]/page.js中添加generateStaticParams,返回数据库中存在的有效id列表,让Next.js构建时用真实id预渲染页面:
export async function generateStaticParams() {
  const client = await clientPromise;
  const db = client.db("amasomo_ya_misa");
  const items = await db.collection("amasomo").find({}, { _id: 1 }).toArray();
  return items.map(item => ({ id: item._id.toString() }));
}
  • 强制动态渲染:如果页面不需要静态预渲染,可在页面组件顶部添加配置,让页面每次请求都动态生成,避免构建时的预渲染:
export const dynamic = "force-dynamic";
  • 添加参数校验:在findIsomoById函数里先校验itemId是否为有效ObjectId,避免无效参数导致报错:
import { ObjectId, isValidObjectId } from "mongodb";

export async function findIsomoById(itemId: string) {
  try {
    if (!isValidObjectId(itemId)) {
      throw new Error("Invalid ObjectId format");
    }
    // 后续数据库查询代码...
  } catch (error) {
    // 错误处理...
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 03:01:00