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

Mongoose报错Query was already executed: User.countDocuments({})如何解决?

错误原因
  • 调用User.countDocuments()时同时使用了回调函数传参与await接收返回值两种查询执行方式,触发了Mongoose的重复执行校验:Mongoose的查询方法只要传入回调参数就会立刻执行查询,此时你对返回的查询对象使用await,Mongoose会尝试二次执行同一条已触发的查询,因此抛出「查询已被执行」的错误。
  • 代码未做异步异常捕获,异步操作抛出的错误没有对应处理逻辑,才会出现未处理的Promise拒绝警告。
  • 原代码判断!userCount后调用res.status(500).json()后没有加return,会导致后续res.send()继续执行,可能额外抛出响应头已设置的错误。
修复方案

推荐使用和当前async语法匹配的await调用方式,移除回调参数,同时增加try/catch做错误捕获,修改后的代码如下:

router.get(`/get/count`, async (req, res) =>{
    try {
        // countDocuments第一个参数为查询条件,空对象代表查询所有用户数量
        const userCount = await User.countDocuments({})
        if(!userCount) {
            return res.status(500).json({success: false})
        } 
        res.send({
            userCount: userCount
        });
    } catch (err) {
        res.status(500).json({success: false, error: err.message})
    }
})

如果你偏好使用回调写法,可移除async/await,写法如下:

router.get(`/get/count`, (req, res) =>{
    User.countDocuments({}, (err, count) => {
        if(err || !count) {
            return res.status(500).json({success: false})
        }
        res.send({userCount: count})
    })
})

内容的提问来源于stack exchange,提问作者Sheik Mohideen.M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:36:05