调用接口时Mongoose的countDocuments方法不生效该如何解决?
错误原因
调用Mongoose的countDocuments方法时,你同时使用了回调传参和await/.then()的Promise调用两种方式,Mongoose会判定需要两次执行该查询,因此抛出「Query was already executed」的错误。你之前去掉async/await语法后仍报错,是因为代码里还是同时存在回调传参和.then()调用,仍然属于两种执行方式混用。
另外你原来的回调写法逻辑也存在问题:countDocuments的回调第一个参数为错误对象,第二个参数才是统计结果,你只写了(count)=>count会直接把错误对象当成统计结果,逻辑完全错误。
修复方案
两种调用方式二选一即可,不要混用:
方案1:async/await写法(推荐)
router.get(`/get/count`, async (req, res) => { try { // 不要传入回调,直接await获取返回结果 const productCount = await Product.countDocuments() if (!productCount) { return res.status(500).json({ success: false }); } return res.send({ productCount: productCount }); } catch (err) { return res.status(500).json({ success: false, error: err.message }) } });
方案2:仅使用回调写法
router.get(`/get/count`, (req, res) => { Product.countDocuments((err, count) => { if (err) { return res.status(500).json({ success: false, error: err.message }) } if (!count) { return res.status(404).json({ success: false }) } return res.send({ productCount: count }) }) });
内容的提问来源于stack exchange,提问作者Veera Silamban
相关产品推荐
相关产品推荐

