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

使用Node.js操作MongoDB删除数据时报objectId不是函数如何解决?

解决方案

核心错误原因

  1. 变量名大小写不匹配:你导入时声明的变量是大驼峰ObjectId,但deleteProduct函数中写了一行console.log(objectId(prodId)),这里用了小驼峰objectId,该变量未定义,调用就会抛出「不是函数」的错误。
  2. 导入写法不匹配驱动版本:MongoDB Node.js驱动3.0版本之后,官方导出的是ObjectId(尾字母小写d),旧版本的ObjectID(尾字母大写D)已经废弃,部分高版本已经移除了该导出。
  3. 未添加错误捕获逻辑: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:51:00