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

如何避免向Mongoose Schema推送无值对象

解决方案:避免向Mongoose推送空供应商对象

核心思路是先判断供应商对象是否包含至少一个有效值,再决定是否执行$push操作,具体实现如下:

1. 编写工具函数检查对象有效性

先实现一个通用函数,用来判断对象是否存在非空、非undefined、非null的有效值:

function hasValidValue(obj) {
  // 检查对象的所有值,只要有一个值满足「不是undefined、null,且不为空字符串(去除首尾空格后)」就算有效
  return Object.values(obj).some(val => val !== undefined && val !== null && val.trim() !== '');
}

2. 动态构建更新参数

修改原代码,仅当供应商对象包含有效值时,才将$push操作加入更新参数:

const editBrand = asyncHandler(async (requestObject, responseObject) => {
  const id = requestObject.params.id;
  const supplierInfo = {};
  const { name, madeIn } = await Brand.findById(id);
  
  if (name !== requestObject.body.name || madeIn !== requestObject.body.madeIn) {
    requestObject.body.slug = slugify(`${requestObject.body.name} ${requestObject.body.madeIn}`);
  }
  
  if (requestObject.body.category) {
    const category = await Category.findOne({ name: requestObject.body.category });
    // 新增判断:找不到对应分类时,移除category字段,避免存入undefined
    if (category) {
      requestObject.body.category = category.id;
    } else {
      delete requestObject.body.category;
    }
  }
  
  if (requestObject.body.supplier) {
    supplierInfo.name = requestObject.body.supplier.name ? format(requestObject.body.supplier.name) : undefined;
    supplierInfo.phone = requestObject.body.supplier.phone || undefined;
    supplierInfo.email = requestObject.body.supplier.email || undefined;
    supplierInfo.address = requestObject.body.supplier.address || undefined;
  }
  
  // 构建基础更新对象
  const updateData = {
    name: requestObject.body.name || undefined,
    madeIn: requestObject.body.madeIn || undefined,
    slug: requestObject.body.slug || undefined,
    category: requestObject.body.category || undefined,
    manufacturer: requestObject.body.manufacturer || undefined,
  };
  
  // 仅当supplierInfo包含有效值时,添加$push操作
  if (hasValidValue(supplierInfo)) {
    updateData.$push = { supplier: supplierInfo };
  }
  
  const update = await Brand.findByIdAndUpdate(
    id,
    updateData,
    { new: true, runValidators: true }
  );
  
  if (!update) {
    return responseObject.status(417).json({ message: "Unable to update record, please try again." });
  }
  
  responseObject.status(200).json(update);
});

关键说明

  • 工具函数hasValidValue覆盖了常见的空值场景(undefined、null、空字符串),你可以根据业务需求调整判断条件(比如是否允许空字符串)。
  • 动态构建updateData避免了无意义的$push操作,彻底解决空供应商对象被存入数据库的问题。
  • 新增了分类查询的容错处理,防止找不到分类时向数据库存入undefined值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:55:42