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

