如何避免向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
相关产品推荐
相关产品推荐

