如何解决Mongoose 6.0.3出现buffering timed out after 10000ms错误
问题原因
这个报错是Mongoose 6.x版本的不兼容改动导致的,核心原因两点:一是你沿用的Mongoose 5.x的连接写法不符合6.x规范,连接没有正确初始化;二是数据库操作在连接成功前就触发,触发了操作缓存超时。
解决方案
- 修正连接代码适配Mongoose 6.x规范
Mongoose 6.x开始mongoose.connect()完全返回Promise,不再支持传入回调函数参数,原来的回调不会正确触发,也无法捕获连接异常。同时6.x默认已经开启useNewUrlParser、useUnifiedTopology、useFindAndModify: false配置,不需要手动传入,冗余传参可能引发冲突。修改后的连接代码如下:
const connectDB = async () => { try { await mongoose.connect(process.env.DB_URI, { keepAlive: true, // 可适当拉长超时时间适配Atlas免费版的网络延迟 serverSelectionTimeoutMS: 30000, socketTimeoutMS: 45000 }) console.log('connected to MongoDB') } catch (error) { console.error('MongoDB连接失败:', error) process.exit(1) } } // 必须等待连接成功后再启动业务逻辑、监听端口 connectDB().then(() => { // 此处放入你的服务启动代码,比如app.listen(3000) })
- 调整数据库操作执行时机
你现在的报错说明在Mongoose还未和Atlas建立连接时,就已经调用了findOne、save等数据库操作,Mongoose默认会将操作缓存10秒,超时未连接就抛出该错误。所有数据库操作必须放在连接成功的回调之后执行,不要让连接逻辑和业务操作并行执行。 - 验证Atlas与网络配置
- 确认
process.env.DB_URI的用户名、密码、目标数据库名填写正确,密码中的特殊字符需要做URL编码 - 确认Atlas控制台的IP白名单已经添加当前运行代码的机器公网IP,测试阶段可临时设置为0.0.0.0/0排除白名单问题(生产环境不要使用该配置)
- 检查本地防火墙、代理是否拦截了27015-27017端口的出站请求
- 版本兼容验证
如果以上操作都无效,可以先降级到Mongoose 5.x最新稳定版确认问题是否消失,Mongoose 6.0.3属于6.0早期版本,存在已知的Atlas连接兼容性bug,也可以升级到Mongoose 6.x最新稳定版修复已知问题。
内容的提问来源于stack exchange,提问作者Mridu
相关产品推荐
相关产品推荐

