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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:24:03