Mongoose执行users.insertOne()时出现缓冲超时错误求助
兄弟,我看了你遇到的这个问题——明明数据库显示连接成功,但增查数据时却报MongooseError: Operation users.insertOne() buffering timed out after 10000ms,而且你已经调整过Mongo的网络设置了对吧?别慌,咱们从代码细节里找找问题,大概率是数据库连接的处理逻辑有漏洞,导致操作发起时数据库其实还没真正连上。
先给你梳理几个关键问题点,以及对应的修复方案:
1. 数据库连接的回调参数写错了
你在server.js里的mongoose.connect回调函数里用了error变量,但这个变量根本没定义!而且你还莫名其妙导入了jQuery的error,这不仅没用,还可能造成变量冲突。正确的回调参数应该是err,用来接收连接错误信息。
2. 移除废弃的Mongoose连接选项
useFindAndModify这个选项在Mongoose 6.x之后已经被废弃了,继续放在连接配置里会触发警告,甚至可能影响连接稳定性,直接删掉就行。
3. 调整中间件的顺序
你把app.use(Router)放在了app.use(cors())前面,这会导致路由请求先被处理,CORS中间件没生效,虽然这不一定直接导致缓冲超时,但也是个潜在的问题,应该把CORS中间件放在路由前面。
4. 必须等数据库连接成功后再启动服务器
这是最核心的问题!你现在是直接启动服务器,不管数据库有没有连上。如果数据库连接慢了点,服务器先跑起来了,这时候发起数据库操作,Mongoose会把操作缓冲起来,等超过10秒还没连上就会报超时错误。所以得确保数据库连接成功后再启动服务器。
修改后的完整代码示例
server.js
const express = require("express"); const mongoose = require("mongoose"); const Router = require("./routes"); const cors = require('cors'); const app = express(); // 中间件顺序调整:先解析JSON,再处理CORS,最后挂载路由 app.use(express.json()); app.use(cors()); app.use(Router); // 用async/await确保数据库连接成功后再启动服务器 async function startServer() { try { await mongoose.connect('mongodb+srv://admin:admin1234@hhap-db.n8zxs62.mongodb.net/test', { useNewUrlParser: true, useUnifiedTopology: true }); console.log("DB Connected"); // 连接成功后再启动服务器 app.listen(3000, () => { console.log("Server is running at port 3000"); }); } catch (err) { console.error("数据库连接失败:", err); process.exit(1); // 连接失败直接退出进程 } } startServer();
router.js(小优化:把express.Router()用对)
你原来的router.js里用了const app = express();,其实应该用express.Router()来创建路由实例,虽然原来的写法也能跑,但不符合规范,改成这样更标准:
const express = require("express"); const userModel = require("./model/userModel"); const router = express.Router(); // 这里改成Router() router.post("/user/create", async (request, response) => { const user = new userModel(request.body); try { await user.save(); response.send(user); } catch (error) { response.status(500).send(error); console.log(error); } }); router.get("/user/getAll", async (request,response) => { try { const user = await userModel.find({}); console.log(user); response.send(user); } catch (error) { response.status(500).send(error); console.log(error); } }); module.exports = router;
userModel.js(没问题,小提示:如果不想让Mongoose自动复数化集合名,可以在model里指定)
比如改成const User = mongoose.model("user", user, "user");,这样集合名就是user而不是自动变成users,不过这不是必须的,看你需求。
做完这些修改后,再试试运行项目,应该就能解决缓冲超时的问题了。本质原因就是之前服务器启动时数据库还没完成连接,导致后续的数据库操作被缓冲直到超时。
备注:内容来源于stack exchange,提问作者Asanka Yaparathna

