使用Node.js操作MongoDB删除数据时报objectId不是函数如何解决?
解决方案
核心错误原因
- 变量名大小写不匹配:你导入时声明的变量是大驼峰
ObjectId,但deleteProduct函数中写了一行console.log(objectId(prodId)),这里用了小驼峰objectId,该变量未定义,调用就会抛出「不是函数」的错误。 - 导入写法不匹配驱动版本:MongoDB Node.js驱动3.0版本之后,官方导出的是
ObjectId(尾字母小写d),旧版本的ObjectID(尾字母大写D)已经废弃,部分高版本已经移除了该导出。 - 未添加错误捕获逻辑:Promise没有编写catch分支,报错后没有处理,才会抛出
UnhandledPromiseRejectionWarning警告。
修正步骤
1. 统一导入写法
使用符合高版本MongoDB驱动的导入方式,固定变量名为ObjectId:
// 原生MongoDB驱动写法 const { ObjectId } = require('mongodb'); // 如果你用的是mongoose,替换为下面的写法 // const { ObjectId } = require('mongoose').Types;
2. 修正deleteProduct函数逻辑
删除错误的小驼峰objectId调用,添加错误捕获和入参校验:
deleteProduct: (prodId) => { return new Promise((resolve, reject) => { // 先校验传入的id是否是有效的ObjectId格式 if (!ObjectId.isValid(prodId)) { return reject(new Error('无效的产品ID格式')) } console.log(prodId) console.log(ObjectId(prodId)) db.get().collection(collection.PRODUCT_COLLECTION) .removeOne({_id: ObjectId(prodId)}) .then(resolve) .catch(reject) // 捕获数据库操作错误 }) }
3. 路由添加错误处理
避免未捕获的Promise报错:
router.get('/delete-product/:id', async (req, res) => { try { const proId = req.params.id console.log(proId) await productHelpers.deleteProduct(proId) res.redirect('/admin/') } catch (err) { console.error('删除产品失败:', err) // 可根据业务需求自定义错误响应,比如跳转错误页、携带错误参数返回 res.redirect('/admin/?err=删除失败') } })
内容的提问来源于stack exchange,提问作者AJB
相关产品推荐
相关产品推荐

