来自 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 毫秒后超时”的主要内容,如果未能解决你的问题,请参考以下文章
在 Java 上运行 PDI Kettle - Mongodb 步骤缺少插件
MongoDB Sink 连接器:Apache Kafka 中的消息被截断
如何通过 PyMongo 和 Bottle 显示来自 MongoDB 数据库的图像?