来自 MongoDB 的错误消息“操作 `disneys.insertOne()` 缓冲在 10000 毫秒后超时”

Posted

技术标签:

【中文标题】来自 MongoDB 的错误消息“操作 `disneys.insertOne()` 缓冲在 10000 毫秒后超时”【英文标题】:Error Message from MongoDB "Operation `disneys.insertOne()` buffering timed out after 10000ms"" 【发布时间】:2021-03-19 11:00:25 【问题描述】:

我目前正在使用 MongoDB 和 Express 创建一个新的 API,并且我目前遇到了这个问题“操作 disneys.insertOne() 缓冲在 10000 毫秒后超时。”我目前正在使用 route.rest 来测试我的 API。

但是,我不知道我目前做错了什么,有人可以看看我的Github Repository 吗?

这是我设置 API 调用的方式:


const express = require("express");
const router = express.Router();
const Disney = require("../models/disneyCharacter");

// Getting all character

router.get("/", async (req, res) => 
  try 
    const character = await Disney.find();
    res.json(character);
   catch (err) 
    res.status(500).json( message: err.message );
  
);
// Getting one Character
router.get("/:id", getCharacter, (req, res) => 
  res.json(res.character);
);

// Creating new Character
router.post("/", async (req, res) => 
  const character = new Disney(
    name: req.body.name,
    details: req.body.details,
  );
  try 
    const newCharacter = await character.save();
    res.status(201).json( newCharacter );
   catch (err) 
    res.status(400).json( message: err.message );
  
);

// Updating one character
router.patch("/:id", getCharacter, async (req, res) => 
  if (req.body.name != null) 
    res.character.name = req.body.name;
  
  if (req.body.details != null) 
    res.character.details = req.body.details;
  
  try 
    const updateCharacter = await res.character.save();
    res.json(updateCharacter);
   catch (err) 
    res.status(400).json( message: err.message );
  
);

// Deleting one character
router.delete("/:id", getCharacter, async (req, res) => 
  try 
    await res.character.remove();
    res.json( message: "Deleted character" );
   catch (err) 
    res.status(500).json( message: err.message );
  
);

async function getCharacter(req, res, next) 
  let character;
  try 
    character = await character.findById(req.params.id);
    if (character == null) 
      return res.status(404).json( message: "Cannot find character" );
    
   catch (err) 
    return res.status(500).json( message: err.message );
  

  res.character = character;
  next();


module.exports = router;


我的参数如下:

const mongoose = require("mongoose");

const disneyCharacter = new mongoose.Schema(
  name: 
    type: String,
    required: false,
  ,
  details: 
    type: String,
    required: false,
  ,
  subscribeDate: 
    type: Date,
    required: true,
    default: Date.now,
  ,
);

module.exports = mongoose.model("Disney", disneyCharacter);

这是我的 API 调用:


Post http://localhost:3000/disneyCharacter
Content-Type: application/json


    "name": "Mickey Mouse",
    "details": "First Character from Disney"


如果您有任何其他问题或疑虑,请告诉我。

【问题讨论】:

【参考方案1】:

试试这个 How to solve Mongoose v5.11.0 model.find() error: Operation `products.find()` buffering timed out after 10000ms"

另外,您的 API 调用似乎有问题,应该是 disneyCharacters 而不是 disneyCharacter

另外,可能先设置一个本地数据库,而不是使用process.env.DATABASE_URL

【讨论】:

是的,将 MongoDB 数据库直接添加到他们的网站中,并在我的配置文件中启用它可以解决所有问题。感谢您的帮助!【参考方案2】:

实际上我也遇到了同样的错误。 我为解决此错误而执行的步骤是

在 mongodb 中创建数据库时

    允许从任何地方访问(IP 配置) 选择最近的服务器

这解决了我的问题:)

【讨论】:

【参考方案3】:

在我的应用程序中抛出了相同的错误消息。 不同之处在于,我使用的是 MongoDB Atlas,而不是本地 MongoDB。

解决方案: 将“+srv”添加到 URL 方案后,问题就消失了:

const mongoose = require("mongoose");
mongoose.set('useUnifiedTopology', true);
mongoose.set('useNewUrlParser', true);
mongoose.connect("mongodb+srv://user:password@host/dbname")
.then( () => console.log("connected to DB."))
.catch( err => console.log(err));

package.json 中的依赖项:

"dependencies": 
"mongoose": "^5.11.12",

MongoDB 版本 4.2.11

连接字符串在 MongoDB Atlas 前端中给出:-> 数据存储 -> 集群 -> 连接 -> 连接您的应用程序

在那里你可以找到一些代码sn-ps。

【讨论】:

【参考方案4】:

我得到这个错误我找到了解决方案

操作insertMany()缓冲在10000ms后超时"

安装 API 调用服务器文件

npm i dotenv

import express from 'express';
import mongoose from 'mongoose';
import data from './data.js';
import userRouter from './routers/userRouter.js';
import dotenv from  'dotenv';
import config from './config.js';

  dotenv.config();
  const mongodburl = config.MONGODB_URL

  const app = express();
  mongoose.connect(mongodburl, 
       useNewUrlParser: true,
       useUnifiedTopology: true,
       useCreateIndex:true,
   ).then(() => console.log('Hurry Database Connected'));

路由器文件 安装快速异步处理程序

npm i express-async-handler

import express from 'express';
import expressAsyncHandler from 'express-async-handler';
import data from '../data.js';
import User from '../models/userModel.js';
             
const userRouter = express.Router();  

userRouter.get(
      '/seed', 
      expressAsyncHandler (async(req,res)=>
     //await User.remove();
      const createdUsers = await User.insertMany(data.users);
      res.send( createdUsers );     
   )
 );

【讨论】:

【参考方案5】:

也试试这个方法: 为了解决错误,我将代码保留在异步等待函数中。成功连接数据库后,只有我们可以进行 CRUD 操作。 Nodejs 遵循单线程执行,即逐行执行。如果任何行正在等待任何请求节点自动转到下一行并首先执行它。因此,如果一行依赖于请求,则放入 async await 函数。

【讨论】:

【参考方案6】:

我遇到了同样的错误。我使用的是 mongoDB Atlas 而不是本地的。对我有用的是删除 .connect 方法中的选项(我正在使用 mongoose 连接到 mongodb)。

以前的代码(导致错误的)

mongoose.connect(
  "" + process.env.DB_URL,
   useUnifiedTopology: true, useNewUrlParser: true, useFindAndModify: false ,
  () =>  console.log("Connected to DB"); 
)

只需在此方法中删除 内的代码即可。

mongoose.connect(
  "" + process.env.DB_URL,
   ,
  () =>  console.log("Connected to DB"); 
)

【讨论】:

【参考方案7】:

在 URL Scheme 中添加 ssl=true 如下所示。

mongodb+srv://:@node-rest-courses.4qhxk.mongodb.net/myFirstDatabase?retryWrites=true&w=majority&ssl=true

【讨论】:

【参考方案8】:

解决此问题的方法是使用 route.rest 文件,因为该文件没有正确执行某些操作。出于同样的原因,我继续在 Mongo DB 中创建了一个新项目来设置集群并创建数据库。

另外,我使用POSTMAN进行了测试

现在一切正常!

【讨论】:

以上是关于来自 MongoDB 的错误消息“操作 `disneys.insertOne()` 缓冲在 10000 毫秒后超时”的主要内容,如果未能解决你的问题,请参考以下文章

mongodb atlas上的快速护照注册错误

在 Java 上运行 PDI Kettle - Mongodb 步骤缺少插件

MongoDB Sink 连接器:Apache Kafka 中的消息被截断

如何通过 PyMongo 和 Bottle 显示来自 MongoDB 数据库的图像?

PHP/MongoDB 错误:未捕获的异常“MongoCursorException”

在流星 js 中显示来自 mongodb 的 Summernote 内容时出错