【问题标题】:I am getting the error MongooseError: Operation `products.find()` buffering timed out after 10000ms AND error: [MongoNetworkError]我收到错误 MongooseError: Operation `products.find()` buffering timed out after 10000ms AND error: [MongoNetworkError]
【发布时间】:2021-05-08 02:15:49
【问题描述】:

这是我的代码。

我收到 Catch 错误:MongooseError: Operation products.find() buffering timed out after 10000ms 在超时。 (C:\Users\tanis\Desktop\amazon-clone\node_modules\mongoose\lib\drivers\node-mongodb-native\collection.js:185:20)

服务器仍在运行...“服务器启动于 http://localhost:5000”

我尝试了 try catch 块,我也尝试使用 module.export 导出它,但不起作用。请帮我解决这个错误。我尝试了很多,但没有解决...我的 Product.find() 在 productRoute.js 文件中,并且 Product 是从 productModule.js 文件中导出的。请帮忙。

     Server.js file
    dotenv.config();
        
        const mongodbUrl = config.MONGODB_URL;
        
        mongoose.connect(mongodbUrl,
         {
        
          useNewUrlParser: true,
        
          useUnifiedTopology: true,
        
          useCreateIndex: true
        
        }).catch(error => console.log(error.reason));
        
        
        
        const app = express();
        
        app.use(bodyParser.json());
        
        app.use("/api/users", userRoute);
        
        app.use("/api/products", productRoute);
    
    
         **- productRoute.js file**
import express from 'express';
import Product from '../models/productModel';
import { isAuth, isAdmin } from '../util';
        const router = express.Router();
        
        router.get("/", async (req, res) => {
          try{
          const products = await Product.find({});
          res.send(products);
          }
          catch(e) {
            console.log('Catch an error: ', e)
          } 
        });
        
        router.get("/:id", async (req, res) => {
          const product = await Product.findOne({ _id: req.params.id });
          if (product) {
            res.send(product);
          } else {
            res.status(404).send({ message: "Product Not Found." });
          }
        });
        
        router.put("/:id", isAuth, isAdmin, async (req, res) => {
          const productId = req.params.id;
          const product = await Product.findById(productId);
          if (product) {
            product.name = req.body.name;
            product.price = req.body.price;
            product.image = req.body.image;
            product.brand = req.body.brand;
            product.category = req.body.category;
            product.countInStock = req.body.countInStock;
            product.description = req.body.description;
            const updatedProduct = await product.save();
            if (updatedProduct) {
              return res.status(200).send({ message: 'Product Updated', data: updatedProduct });
            }
          }
          return res.status(500).send({ message: ' Error in Updating Product.' });
        
        });
        
        router.delete("/:id", isAuth, isAdmin, async (req, res) => {
          const deletedProduct = await Product.findById(req.params.id);
          if (deletedProduct) {
            await deletedProduct.remove();
            res.send({ message: "Product Deleted" });
          } else {
            res.send("Error in Deletion.");
          }
        });
        
        
        router.post("/", isAuth, isAdmin, async (req, res) => {
          const product = new Product({
            name: req.body.name,
            price: req.body.price,
            image: req.body.image,
            brand: req.body.brand,
            category: req.body.category,
            countInStock: req.body.countInStock,
            description: req.body.description,
            rating: req.body.rating,
            numReviews: req.body.numReviews,
          });
          const newProduct = await product.save();
          if (newProduct) {
            return res.status(201).send({ message: 'New Product Created', data: newProduct });
          }
          return res.status(500).send({ message: ' Error in Creating Product.' });
        })
        
        
        export default router;
    
         - **productModel.js file**
        
            import mongoose from 'mongoose';
            
            const prodctSchema = new mongoose.Schema({
              name: { type: String, required: true },
              image: { type: String, required: true },
              brand: { type: String, required: true },
              price: { type: Number, default: 0, required: true },
              category: { type: String, required: true },
              countInStock: { type: Number, default: 0, required: true },
              description: { type: String, required: true },
              rating: { type: Number, default: 0, required: true },
              numReviews: { type: Number, default: 0, required: true },
            });
            
            const productModel = mongoose.model("Product", prodctSchema);
            //module.exports = mongoose.model("Product", prodctSchema);
            export default productModel;

【问题讨论】:

    标签: mongodb server


    【解决方案1】:

    类似帖子#link

    根据 MongoDB 文档,您收到此错误的原因是 在建立连接之前调用您的模型。您需要将 async/await 与 connect() 或 createConnection() 一起使用

    我认为在您的情况下应该添加一个 .then 块 这是解决方案

      mongoose.connect(mongodbUrl, {
        useNewUrlParser: true,
        useUnifiedTopology: true,
        useCreateIndex: true
    }).then(
        const app = express(); 
        app.use(bodyParser.json()); 
        app.use("/api/users", userRoute); 
        app.use("/api/products", productRoute);
        ).catch(error => console.log(error.reason));
    

    更优雅的方法是分离应用程序和服务器逻辑

    创建一个 app.js 文件并添加

    const app = express();
    app.use(bodyParser.json());
    app.use("/api/users", userRoute);
    app.use("/api/products", productRoute);
    module.exports = app;
    

    在 server.js 中,在对 db 连接进行排序后导入 app.js

    const mongoose = require('mongoose');
    const dotenv = require('dotenv');
    dotenv.config({ path: './config.env' });
    const app = require('./app');
    
    mongoose.connect(mongodbUrl,
             {
              useNewUrlParser: true,
              useUnifiedTopology: true,
              useCreateIndex: true
            }).then(()=>{
    console.log('DB connection successful!')
    }).catch(error => console.log(error.reason));
    
    app.listen(8080, () => {
      console.log(`App running on port http://localhost:${port}... `);
    });
    

    这样你的应用只有在连接 Mongodb 后才会开始监听请求

    这两个选项中的任何一个都可以解决您的问题

    【讨论】:

    • 谢谢!它是进口的,对不起,我没有将它包含在帖子中..但现在我做到了..
    • 我已根据您的评论更新了我的答案。如果此解决方案有效,请将其标记为答案并投赞成票
    【解决方案2】:

    我遇到了同样的错误,我的连接以前可以正常工作。就我而言,我什至没有获得成功(尝试)或失败(捕获)控制台日志。没有错误,Mongoose 似乎完全忽略了 connect() 调用。为了查看它是否确实执行了 connect(),我试图通过使其无效来伪造 URI,但确实得到了一个错误。这证明 connect() 确实尝试连接,但实际上连接失败并且没有返回任何错误。在连接(来自 Express API 服务器)之后,当我尝试从前端进行 API 调用时,我得到了这个臭名昭著的 Error fetching products Operation products.find() buffering timed out after 10000ms 错误,表明没有建立数据库连接。任何想法?我在 Mongoose 5.11.16 上,甚至试图将其降级到 5.10.x。我的节点版本是 12.18.0

    【讨论】:

      猜你喜欢
      • 2021-12-06
      • 2014-08-19
      • 2018-03-29
      • 1970-01-01
      • 2016-03-17
      • 1970-01-01
      • 2020-07-15
      • 2019-06-11
      • 2012-02-22
      相关资源
      最近更新 更多