这是我的连接文件
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 的新手
答案 0 :(得分:0)
首先连接到您的数据库,然后启动您的服务器。
您试图在没有连接到数据库的情况下查询数据库。
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
答案 1 :(得分:0)
在尝试写入之前打开您的 Mongo 服务器并连接到您的数据库。
答案 2 :(得分:0)
就我而言,我使用的是 monorepo,一个包启动服务器,另一个包包含猫鼬模型。
其中一个软件包在其 package.json
的依赖项上具有不同的 mongoose 版本。
在确保两个包具有相同版本的 mongoose,然后在 monorepo 的根目录运行 yarn
以正确重新链接依赖项后,问题得到解决。
对于任何想知道的人,我可以在 monorepo 中的两个不同的包上使用 mongoose,因为 mongoose 基本上是一个单例类,这意味着它通常会尝试使用预先存在的 mongoose 实例,而无需初始化.
有两个版本的 mongoose 破坏了这种单例功能,因为(就 Node 而言)服务器上的实例是使用与我的模型包中不同的 mongoose 包创建的。
TL;DR 确保您的 monorepo 中依赖于 mongoose 的任何包在其各自的 package.json
文件中具有相同版本的 mongoose。
答案 3 :(得分:0)
这个问题已经有人回答了,但是当我遇到同样的问题时,原因却大不相同。出于某种原因,我将 Mongodb 连接 URI 放在配置变量的引号内。永远不要那样做。当我删除引号时,一切正常。