Mongoose报错tests.findOne()缓冲超时10000ms 无法写入MongoDB Atlas
问题根因
Mongoose的Operation xxx buffering timed out报错本质是数据库实际连接完成前,接口就已经开始接收请求执行数据库操作,你看到的"Database connected"日志和应用启动成功不代表连接已经就绪,因为你是异步调用connectDB(),没有等它执行完成就启动了端口监听,此时模型发起的数据库操作会进入缓存队列,等到超时后就抛出该错误。
修复步骤
- 调整入口文件
index.js的启动逻辑,等数据库连接成功后再监听端口
将原代码:
connectDB(); app.listen(3001, ()=> { console.log("running on port 3001 new try") })
修改为:
connectDB().then(() => { app.listen(3001, () => { console.log("running on port 3001 new try") }) }).catch(err => { console.log("启动失败,数据库连接异常:", err) })
- 校验MongoDB Atlas连接串配置,
process.env.DATABASE_ACCESS对应的连接串必须明确指定要操作的数据库名,标准格式如下,很多用户漏填/后的数据库名会导致连接挂起超时:
mongodb+srv://<用户名>:<密码>@cluster0.mongodb.net/<你的业务数据库名>?retryWrites=true&w=majority
- 适配Mongoose版本参数,如果你使用的是Mongoose 6.x及以上版本,
useNewUrlParser、useUnifiedTopology、useCreateIndex三个配置已经默认开启,保留旧参数反而会触发兼容问题,修改db.js的连接代码:
try { await mongoose.connect(process.env.DATABASE_ACCESS, () => { console.log("Database connected") }) } catch(err) { console.log("Error in db connection", err) }
- 排查网络限制,部分公司、学校的防火墙会屏蔽MongoDB默认的27017端口,可临时切换手机热点测试请求是否正常。
- 若需要更明确的报错信息排查,可在连接配置中添加
bufferCommands: false关闭Mongoose的操作缓存,连接未就绪时发起数据库操作会直接抛出连接异常,而非等待超时:
await mongoose.connect(process.env.DATABASE_ACCESS, { bufferCommands: false }, () => { console.log("Database connected") })
验证方法
修改完成后重启服务,先等待控制台打印出Database connected日志后,再发起POST测试请求即可。
内容的提问来源于stack exchange,提问作者GDaskalov
相关产品推荐
相关产品推荐

