运行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
相关产品推荐
相关产品推荐

