Mongoose调用convertDocToObj报错无法读取null的_id属性如何解决
问题成因
- 核心触发原因:当访问不存在的产品slug路径时,
pages/product/[slug].js中Product.findOne({ slug }).lean()查询无匹配数据,返回值为null,代码未做判空直接将null传入convertDocToObj函数,函数尝试读取null的_id属性触发TypeError。 - 潜在问题:
convertDocToObj函数未做入参合法性校验,鲁棒性不足,只要传入非对象类型的假值就会触发报错。 - 额外隐藏问题:
pages/index.js渲染时错误使用data.products.map,但props解构的字段是products,无全局data变量,后续会触发未定义错误。
修复方案
1. 改造convertDocToObj函数增加入参校验
修改utils/db.js中的函数,增加入参判断和字段存在性判断,避免空值报错:
function convertDocToObj(doc) { // 入参为空直接返回 if (!doc) return doc // 字段存在才执行转换 if (doc._id) doc._id = doc._id.toString(); if (doc.createdAt) doc.createdAt = doc.createdAt.toString(); if (doc.updatedAt) doc.updatedAt = doc.updatedAt.toString(); return doc; }
2. 产品详情页增加查询为空的404逻辑
修改pages/product/[slug].js的getServerSideProps,查询为空时直接返回404,不进入转换逻辑:
export async function getServerSideProps(context) { const { params } = context; const { slug } = params; await db.connect(); const product = await Product.findOne({ slug }).lean(); await db.disconnect(); // 新增判空逻辑,返回404 if (!product) { return { notFound: true } } return { props: { product: db.convertDocToObj(product), }, }; }
3. 修复首页的变量引用错误
修改pages/index.js中的渲染逻辑,将data.products.map改为products.map:
// 原代码 {data.products.map((product) => ( // 修改为 {products.map((product) => (
内容的提问来源于stack exchange,提问作者Vision
相关产品推荐
相关产品推荐

