You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mongoose执行users.insertOne()时出现缓冲超时错误求助

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 13:03:21