Mongoose连接本地MongoDB超时求助:insertOne缓冲超时10000ms
问题原因与解决方法
原因分析
你的代码中,数据库连接是异步操作,但调用user.save()时Mongoose还未完成与MongoDB的连接。Mongoose会将未完成连接时的操作放入缓冲队列,等待连接成功后执行,但如果连接耗时超过默认10秒的缓冲超时时间,就会抛出buffering timed out错误。
另外,你使用的mongoose.connect回调写法不会阻塞后续代码执行,导致插入操作先于连接完成触发,再加上本地连接可能因MongoDB服务启动慢、本地资源占用等问题延迟,直接触发了超时。
解决方法
以下几种方式可确保连接完成后再执行数据库操作:
方法1:使用async/await(推荐)
将连接逻辑封装在异步函数中,等待连接成功后再执行插入:
// script.js const mongoose = require('mongoose') const User = require("./User") async function main() { try { await mongoose.connect("mongodb://localhost/bh_db"); console.log("mongoose has been connected"); // 连接成功后创建并保存用户 const user = new User({name:"Kyle", age: 26}); await user.save(); console.log("User Saved"); } catch (err) { console.error(err); } } main();
方法2:监听Mongoose的connected事件
通过事件监听确保连接完成后执行操作:
// script.js const mongoose = require('mongoose') const User = require("./User") mongoose.connect("mongodb://localhost/bh_db") .catch(err => console.error(err)); // 监听连接成功事件 mongoose.connection.on('connected', () => { console.log("mongoose has been connected"); const user = new User({name:"Kyle", age: 26}); user.save().then(() => console.log("User Saved")); });
方法3:使用Promise链式调用
利用mongoose.connect返回的Promise,在连接成功后执行插入:
// script.js const mongoose = require('mongoose') const User = require("./User") mongoose.connect("mongodb://localhost/bh_db") .then(() => { console.log("mongoose has been connected"); const user = new User({name:"Kyle", age: 26}); return user.save(); }) .then(() => console.log("User Saved")) .catch(err => console.error(err));
如果本地连接确实偏慢,可临时调整缓冲超时时间(不推荐作为核心解决方案):
mongoose.connect("mongodb://localhost/bh_db", { bufferTimeoutMS: 30000 // 改为30秒超时 });
内容的提问来源于stack exchange,提问作者asdaw1
相关产品推荐
相关产品推荐

