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
相关产品推荐
相关产品推荐

