【问题标题】:MongooseError: Operation `users.findOne()` buffering timed out after 10000msMongooseError:操作 `users.findOne()` 缓冲在 10000 毫秒后超时
【发布时间】:2021-06-30 11:33:43
【问题描述】:

这是我的连接文件


const connectDB = async () =>{
        const conn = await new mongoose("mongodb+srv://nikunj:gadia7420@cluster0.94xph.mongodb.net/myFirstDatabase?retryWrites=true&w=majority",
        {
            usenewurlparser:true,
            usecreateindex:true,
            usefindmodify:true,
            useunifiedtropology:true,
            urlencoded:true
        })
}
module.exports = connectDB;

这是我的模型文件


const userSchema = new mongoose.Schema({
    username:{
        type:String,
        required:true
    },
    avatar:{
        type:String,
    },
    email:{
        type:String,
        required:true
    },
    password:{
      type  : String,
     required:true
    }
});
module.exports = mongoose.model('user',userSchema);

此文件将插入或从数据库中获取信息以进行注册

const express = require('express');
const router = express.Router();
const User = require('../models/user');
const bcrypt= require('bcrypt');

router.post('/register',async(req,res,next)=>{
    const  {username,email,password}=req.body;
    try{
        let user_exist = await User.findOne({email:email});
        if(user_exist){
            success="false";
            msg="user already exist";
        } else {
            //importing data to models
            let user = new User();
            user.username = username;
            user.email = email ;
            const salt = await bcrypt.genSalt(10);
            user.password =  await bcrypt.hash(password,salt),
            user.avatar =  "https://gravatar.com/avatar/?s=200&d=retro"
            await user.save();
            res.json({
                sucess:true,
                user:user,
                msg:"user registered"
            })
        }
    }
    catch(err){
        console.log(err);
    }
});

module.exports = router;

这是我的主文件 (server.js)

const express = require('express');
const morgan = require('morgan');
const colors = require('colors');
const dotenv = require('dotenv');
const mongoose = require('mongoose');
const connectDB = require('./config/db');
//creating main platform
connectDB;
console.log(mongoose.connection.readyState);
const app = express();
app.use(morgan('dev'));
dotenv.config({
    path:'./config/config.env'
})
app.use(express.json({}))
app.use(express.json({
    extended:true
}))

//creating server
app.use('/api/todo/auth',require('./routes/user'));
const Port = process.env.port;
app.listen(Port,
    console.log(`listening on port :${Port}` .red.underline.bold));
//creating req,res platform

但是在运行它之后,它在发出发布请求时显示错误

MongooseError: Operation `users.findOne()` buffering timed out after 10000ms
    at Timeout.<anonymous> (D:\nikunj\Programming\todoapp\node_modules\mongoose\lib\drivers\node-mongodb-native\collection.js:185:20)
    at listOnTimeout (node:internal/timers:556:17)
    at processTimers (node:internal/timers:499:7)

请为此找到解决方案。谢谢。对不起,如果这是一个愚蠢或错误的问题,因为我是这个 nodejs 的新手

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    这个问题已经回答了,但是当我遇到同样的问题时,原因却大不相同。出于某种原因,我将 Mongodb 连接 URI 放在配置变量中的引号内。永远不要那样做。当我删除引号时,一切正常。

    【讨论】:

      【解决方案2】:

      就我而言,我使用的是 monorepo,一个包启动服务器,另一个包包含 mongoose 模型。

      其中一个包在 package.json 的依赖项上有不同的 mongoose 版本。

      在确保两个包具有相同版本的 mongoose 然后在 monorepo 的根目录运行 yarn 以正确重新链接依赖项后,问题得到了解决。


      对于任何想知道的人,我可以在一个 monorepo 中的两个不同包上使用 mongoose,因为 mongoose 基本上是一个单例类,这意味着它通常会尝试使用预先存在的 mongoose 实例,无论何时提及它而无需初始化.

      拥有两个版本的 mongoose 会破坏这种单例功能,因为(就 Node 而言)服务器上的实例是使用与我的模型包中的不同的 mongoose 包创建的。


      TL;DR 确保 monorepo 中依赖于 mongoose 的所有软件包在其各自的 package.json 文件中具有相同版本的 mongoose。

      【讨论】:

        【解决方案3】:

        在尝试写入之前打开您的 Mongo 服务器并连接到您的数据库。

        【讨论】:

          【解决方案4】:

          首先连接到您的数据库,然后启动您的服务器。

          您正在尝试查询数据库而不连接到您的数据库。

          https://mongoosejs.com/docs/connections.html#buffering

          Mongoose 让您可以立即开始使用模型,而无需等待 mongoose 与 MongoDB 建立连接。

          那是因为猫鼬在内部缓冲模型函数调用。这种缓冲很方便,但也是一个常见的混淆来源。如果你使用没有连接的模型,Mongoose 默认不会抛出任何错误。


          connectDB()
              .then(() -> {
                  app.listen(Port, console.log(`listening on port :${Port}` .red.underline.bold));
              }).catch((e) => {
                  console.log(e);
              })
          

          你没有调用函数connectDB

          【讨论】:

            猜你喜欢
            • 2021-04-01
            • 2021-08-23
            • 2021-11-15
            • 2021-12-08
            • 2021-04-01
            • 2021-04-12
            • 2021-04-11
            • 1970-01-01
            • 2022-11-28
            相关资源
            最近更新 更多