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

