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

Mongoose运行报错TypeError: findTag.delete is not a function如何解决

报错原因

  • tagSchema.findOne() 是Mongoose的异步查询方法,未添加await关键字时返回的是 Mongoose Query对象,并非你预期查询到的标签文档实例,该Query对象本身没有delete方法,直接调用就会抛出类型错误。
  • 即使正确拿到了文档实例,Mongoose新版本也已经废弃了文档实例的delete()方法,目前官方推荐使用deleteOne()实例方法,或者直接使用查询删除一体的API。

解决方案

方案1:修正原写法的异步逻辑

补全异步关键字,替换废弃方法即可:

// 注意:如果引入的是编译后的Mongoose Model,建议将变量名改为tagModel,避免和Schema概念混淆
const tagModel = require('../schemas/tagSchema')

module.exports = async () => {
    // 函数添加async标识支持await
    const autoDeleteTag = async function () {
        const currentTime = Date.now()
        // 添加await拿到真实的文档实例
        const findTag = await tagModel.findOne({ timeExpired: { $lt: currentTime } })
        if (findTag) {
            // 替换为deleteOne方法,异步操作需要加await
            await findTag.deleteOne()
        }
    }
    setInterval(autoDeleteTag, 120000)
}

方案2:高效批量删除(推荐)

不需要先查询再逐个删除,直接调用deleteMany一次性清理所有过期标签,性能更高:

const tagModel = require('../schemas/tagSchema')

module.exports = async () => {
    const autoDeleteTag = async function () {
        const currentTime = Date.now()
        // 直接删除所有符合条件的过期标签,返回值可拿到删除数量,有需要可自行加日志
        await tagModel.deleteMany({ timeExpired: { $lt: currentTime } })
    }
    setInterval(autoDeleteTag, 120000)
}

额外注意

  • 所有Mongoose的异步操作都必须加await,否则只会拿到Query对象而非操作结果。
  • 如果需要捕获删除过程中的异常,可以在autoDeleteTag内部加try/catch块处理,避免静默失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 07:24:00