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

MongoDB删除数据报错:Class constructor ObjectId无法无new调用

解决MongoDB ObjectId报错:Class constructor ObjectId cannot be invoked without 'new'

问题场景

编写Express+MongoDB的CRUD接口时,删除接口中尝试用ObjectId(id)转换URL参数的ID,触发如下报错:

TypeError: Class constructor ObjectId cannot be invoked without 'new'

即使改用ObjectID = require('mongodb').ObjectID的写法,问题依然存在。

报错原因

MongoDB Node.js驱动的新版本中,ObjectId是一个类,必须通过new关键字实例化,不能直接当作普通函数调用。旧版本中允许直接调用的写法已被废弃。

解决方案

将ObjectId(id)改为new ObjectId(id),通过new关键字正确实例化ObjectId对象。

修改你的删除接口代码:

//deleting a user
app.delete("/users/:id", async (req, res) => {
  const id = req.params.id;
  // 用new关键字实例化ObjectId
  const query = { _id: new ObjectId(id) };
  console.log(query)
  const result = await userCollection.deleteOne(query);
  console.log(result);
  res.send(result);
});

补充说明

如果你习惯旧写法,也可以使用ObjectId.createFromHexString(id)方法(效果和new ObjectId(id)一致),但官方更推荐使用new关键字的标准类实例化方式。

另外,注意驱动版本的导入写法:新版本中是const { ObjectId } = require("mongodb");(驼峰式),旧版本的ObjectID(全大写ID)写法已被逐步淘汰,建议统一使用驼峰式的ObjectId。


内容的提问来源于stack exchange,提问作者Sadman Ador

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:57:22