【问题标题】:countDocuments() is not working in api callcountDocuments() 在 api 调用中不起作用
【发布时间】:2021-11-08 05:19:38
【问题描述】:

我正在尝试使用 api 调用获取产品数量,但在邮递员中它会继续加载

router.get(`/get/count`,  async (req, res) => {
  const productCount = await Product.countDocuments((count)=>count)
  if (!productCount) {
    res.status(500).json({ success: false });
  }
  res.send({
    productCount: productCount
  });
});

(node:28030) UnhandledPromiseRejectionWarning: MongooseError: Query was already executed: Product.countDocuments({})

没有异步和等待也不工作

我试图捕捉错误,我在邮递员中得到了这个错误

{
   "success": false,
   "error": "Query was already executed: Product.countDocuments({})"
}

捕获错误的代码:

router.get(`/get/count`,   (req, res) => {
   Product.countDocuments((count)=>count).then((pcount)=>{
   if(pcount){
     return res.status(200).json({success:true})
   }else{
      return res.status(404).json({success:false})
   }
   }).catch((err)=>{
     return res.status(400).json({success:false, error:err.message})
   })

});

【问题讨论】:

    标签: javascript node.js postman


    【解决方案1】:

    认为在 Mongoose 操作中,您希望要么 await 提供回调,但不能同时提供。尝试同时执行这两种操作会导致它在内部执行两次查询。

    试试吧:

    const productCount = await Product.countDocuments();
    

    【讨论】:

    • 你能告诉我如何在 api 调用中使用它,它仍然给我同样的错误
    【解决方案2】:

    如果你想统计你的产品集合中的所有产品,试试这个

    db.product.countDocuments({})
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案3】:
    router.get(`/get/count`,  async(req, res) => {
      let productCount = await Product.countDocuments();
    
      if(!productCount){
        res.send(500).json({success:false})
      }
    
      res.send({productCount: productCount})
    });
    

    【讨论】:

      【解决方案4】:

      有两种方法可以做到这一点

      试试看你不需要使用回调(count)=>count

      const express = require('express')
      const router = express.Router();
      const {Product} = require('../models/products')
      const {Category} = require('../models/category')
      const catchAsyncErrors = require('../middleware/catchAsyncError')
      const mongoose = require('mongoose');
      
      
      // Get all product 
      router.get(`/`, async (req, res) => {
          let productList = await Product.find().populate('category')
      
          if(!productList) {
              res.status(500).json({
                  success: false
              })
          }
          res.status(200).json({
              success: true,
              count: productList.length,
              productList
      
          });
      })
      
      router.get(`/count`, catchAsyncErrors(async(req, res) => {
          const countProductList = await Product.countDocuments();
      
          if(!countProductList){
      
              res.status(500).json({
                  success: false
              })
          }
          res.send({
              success: true,
              countProduct: countProductList
          })
      
      }))
      

      【讨论】:

      • 虽然这段代码 sn-p 可以解决问题,但它没有解释为什么或如何回答这个问题。请include an explanation for your code,因为这确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
      猜你喜欢
      • 2017-01-17
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      • 2021-09-13
      • 1970-01-01
      相关资源
      最近更新 更多