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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:24:04