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

运行MongoDB更新代码报TypeError: mongodb.ObjectId is not a constructor问题咨询

错误产生原因
  • MongoDB Node.js驱动3.0及以上版本调整了ObjectId的导出结构,旧版本中mongodb.ObjectId直接作为构造器的写法已被废弃,新版本中ObjectId要么需要单独解构导入,要么需要通过mongodb.Types.ObjectId路径访问。
  • 小概率原因是mongodb模块导入错误,或者你安装的mongodb包存在文件损坏。
  • 额外注意:你原有代码还有一处隐藏问题,findOneAndUpdate的回调函数参数重复声明了req和res,会覆盖外层路由的响应对象,导致res.send无法正常执行,也需要同步修改
解决方案

方案1:调整导入语句(推荐)

导入mongodb模块时直接解构获取ObjectId,后续直接调用即可:

// 导入时解构
const { MongoClient, ObjectId } = require('mongodb');

// 修改后的接口代码
app.post('/update-item',function(req,res){
  // 先校验id格式合法性,避免后续报错
  if (!ObjectId.isValid(req.body.id)) {
    return res.status(400).send('非法的id格式');
  }
  db.collection('items').findOneAndUpdate(
    {_id: new ObjectId(req.body.id)}, 
    {$set: {text: req.body.text}}, 
    function (err, result) {
      // 回调参数不要和外层的req、res重名
      res.send("Success");
    }
  );
});

方案2:不修改导入语句,直接调整构造器路径

如果不想改动原有mongodb模块的导入代码,直接把构造器的访问路径改成mongodb.Types.ObjectId即可:

app.post('/update-item',function(req,res){
  db.collection('items').findOneAndUpdate(
    {_id: new mongodb.Types.ObjectId(req.body.id)}, 
    {$set: {text: req.body.text}}, 
    function (err, result) {
      res.send("Success");
    }
  );
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 00:30:04