mongoose的findOneAndUpdate查询不生效且报TypeError如何解决
错误核心原因
你触发报错的根本原因是findOneAndUpdate方法的参数使用错误:
- 该方法的标准传参顺序为
(查询条件对象, 待更新字段对象, 配置项, 回调函数),你在第二个参数的位置传入了id字符串,mongoose期望该位置接收对象类型的更新内容,因此抛出了「无法将undefined或null转换为对象」的类型错误。 - 除此之外你的逻辑也不符合需求:你把
site、content等需要更新的字段都放到了查询条件中,会导致只有当前文档的这些字段和传入值完全匹配时才会命中查询,否则即使_id匹配也不会执行更新,反而会因为upsert:true生成新的冗余文档。
修正后代码
// 仅用_id作为查询匹配条件 const query = { _id: req.body.id }; // 所有需要更新的字段统一放到更新对象中 const updateFields = { site: req.body.location, content: req.body.services, updatedByCNUM: req.body.cnum }; ServicesModel.findOneAndUpdate( query, updateFields, { upsert: true, // 确认是否需要找不到匹配_id时新建文档,不需要可以删除该配置 new: true // 开启后回调会返回更新后的文档,不需要可以删除 }, function(err, doc) { if (err) return res.status(500).send({ error: err }); return res.send('Successfully saved.'); } ); // 注意字段大小写一致性,你之前打印的req.body.Services和代码中使用的req.body.services大小写不同,避免取值为undefined console.log(req.body.services, req.body.location)
可选优化
如果你的Schema使用mongoose默认的ObjectId类型作为_id,建议手动将传入的字符串id转为ObjectId类型,避免低版本mongoose的自动转换异常:
const query = { _id: mongoose.Types.ObjectId(req.body.id) };
内容的提问来源于stack exchange,提问作者Gianluca
相关产品推荐
相关产品推荐

