Mongoose查询超时求助:users.find()缓冲超时10000ms
解决MongooseError: Operation
users.find() buffering timed out after 10000ms问题 问题场景
开发小型消息类项目时,后端使用Mongoose从MongoDB获取数据,触发报错:
MongooseError: Operation
users.find()buffering timed out after 10000ms
控制台明确显示数据库已成功连接,排查模型代码无异常后,发现User模型的导入位置是问题根源,将其调整到代码内部后问题解决。
问题原因
Mongoose模型需要绑定到已初始化完成的数据库连接上。原代码在调用mongoose.connect()之前就导入了User模型,此时Mongoose还未完成数据库连接,模型会关联到未就绪的连接池,后续执行User.find()时,操作无法正常发送到数据库,最终触发缓冲超时。
解决方法
将User模型的导入语句,移到数据库连接完成之后的代码逻辑中,确保模型加载时Mongoose已经建立好数据库连接。
修正后代码
后端代码
const express = require("express"); const mongoose = require("mongoose"); const cors = require("cors"); const http = require("http"); const app = express(); app.use(cors()); app.use(express.json()); app.use(express.static("public")); const server = http.createServer(app); const io = require("socket.io")(server, { cors: { origin: ["http://localhost:5173"], }, }); const db = "link"; async function toMongoose() { try { await mongoose.connect(db); console.log("Connected"); // 在连接成功后导入User模型 const User = require("../models/user"); // 定义查询路由 app.get("/get-users", async (req, res) => { try { const users = await User.find(); res.json(users); } catch (err) { res.status(500).json({ error: err.message }); } }); } catch (err) { console.log(err); } } toMongoose(); io.on("connection", (socket) => { console.log(socket.id); socket.on("sending-message", (message) => { socket.broadcast.emit("receive-message", message); }); }); server.listen(3000, () => { console.log(`Server running on http://localhost:3000`); });
模型代码(无需修改)
const mongoose = require("mongoose"); const Schema = mongoose.Schema; const userSchema = new Schema({ username: { type: String, required: true, }, }); const User = mongoose.model("User", userSchema); module.exports = User;
补充说明
如果项目路由较多,建议将路由逻辑拆分到单独文件中,在数据库连接成功后再统一挂载路由,既避免单个文件代码冗余,也能保证所有模型都关联到已就绪的数据库连接。
内容的提问来源于stack exchange,提问作者Batyrlan
相关产品推荐
相关产品推荐

