Mongoose findByIdAndUpdate 方法更新数据不生效返回原文档
Mongoose findByIdAndUpdate 更新不生效、返回原文档修复方案
核心踩坑点
- 配置项版本不兼容:
returnDocument: "after"仅支持 Mongoose 6.x 及以上版本,5.x 及更早版本无法识别该配置,默认返回更新前的原始文档,老版本需要使用通用配置new: true来指定返回更新后的文档。 - Schema 字段未定义:Mongoose 默认开启严格模式,如果你在 User Schema 中没有声明
profileImage字段,传入的更新参数会被自动过滤,不会写入数据库。如果需要写入未预定义的字段,可以在 Schema 配置或者更新选项中添加strict: false。 - 更新语法不严谨:直接传更新对象在部分版本中可能出现字段覆盖异常,显式使用
$set操作符指定要更新的字段更稳妥,不会误修改文档其他字段。 - 无效参数干扰:你贴的代码 else 块中残留了
enter code here无效占位符,虽然不影响核心逻辑但需要清理;同时要提前校验req.body.id是合法的 ObjectId 格式、uri变量为有效的头像地址字符串,不存在空值/undefined 情况。
修正后可运行代码
User.findByIdAndUpdate( req.body.id, { $set: { profileImage: uri } }, { new: true }, function (err, docs) { if (err) { console.log(err) return res.status(400).send("Error updating image") } if (!docs) { return res.status(404).send("User not found") } console.log("Updated User : ", docs) res.status(200).send("Image updated") } )
额外排查方向
- 代码执行后直接连接数据库查询对应用户记录,确认字段是否真的写入,排除传参id错误、更新到其他用户记录的情况
- 检查User Schema中
profileImage的字段类型定义,如果和传入的uri类型不匹配,Mongoose会静默丢弃类型不符合的字段,不会执行更新
内容的提问来源于stack exchange,提问作者Fiyaz
相关产品推荐
相关产品推荐

