NodeJS Mongoose 错误:操作'users.findOne()'缓冲在10000ms后超时

ar5n3qh5  于 2022-11-29  发布在  Node.js
关注(0)|答案(6)|浏览(231)

这是我的连接文件

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

但运行此程序后,在发出post请求时显示错误

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)

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

vddsk6oq

vddsk6oq1#

首先连接到数据库,然后启动服务器。
您试图在未连接到数据库的情况下查询数据库。
https://mongoosejs.com/docs/connections.html#buffering
Mongoose让您可以立即开始使用您的模型,而不需要等待mongoose建立到MongoDB的连接。
这是因为mongoose在内部缓冲模型函数调用。这种缓冲很方便,但也是一个常见的混淆源。如果你使用一个没有连接的模型,默认情况下Mongoose不会抛出任何错误。

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

您没有调用函数connectDB

owfi6suc

owfi6suc2#

打开Mongo服务器并连接到数据库,然后再尝试写入。

14ifxucb

14ifxucb3#

在我的例子中,我使用的是monorepo,一个包启动服务器,另一个包包含mongoose模型。
其中一个软件包在其package.json的依赖项上有不同的mongoose版本。
在确保两个包都有相同版本的mongoose,然后在monorepo的根目录运行yarn以正确地重新链接依赖关系后,问题得到了修复。
对于任何想知道的人,我可以在monorepo中的两个不同的包上使用mongoose,因为mongoose基本上是一个单例类,这意味着它通常会尝试使用一个预先存在的mongoose示例,无论它在哪里被提到,都不会初始化。
有两个版本的mongoose会破坏这种单例功能,因为(就Node而言)服务器上的示例是使用不同的mongoose包创建的,而不是我的models包。

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

s4n0splo

s4n0splo4#

这个问题已经得到了解答,但是当我遇到同样的问题时,原因却大不相同。出于某种原因,我在config vars中把Mongodb连接URI放在引号内。千万不要这样做。当我去掉引号时,一切都很好。

tag5nh1u

tag5nh1u5#

我在mongoose v“^6.3.4”中遇到了这个问题,当我在mongodb的侧栏上从网络访问中删除我的IP并再次添加它时,它工作了

yhqotfr8

yhqotfr86#

我在mongoose v“^6.3.4”中遇到了这个问题,当我在mongodb的侧栏上从网络访问中删除我的IP并再次添加它时,它工作了
这对我也有效。我删除了我的IP,并在网络访问页面上选择了“允许从任何地方访问”选项,它成功了。
(我认为这是安全的:(第10页)

相关问题