Mongoose操作超时求助:deleteMany/insertOne缓冲超时10000ms
问题描述
运行Node.js代码时,控制台先输出Database connected提示数据库已连接,但随后抛出超时错误:
MongooseError: Operation
campgrounds.deleteMany()buffering timed out after 10000ms
即使删除deleteMany({})代码,依然会出现另一超时错误:
MongooseError: Operation
campgrounds.insertOne()buffering timed out after 10000ms
尝试添加catch捕获错误,问题依旧存在。代码如下:
const mongoose = require("mongoose"); const cities = require("./cities"); const { places, descriptors } = require("./seedHelpers"); const Campground = require("../models/campground"); mongoose.connect("mongodb://127.0.0.1:27017/camp-spot"); const db = mongoose.connection; db.on("error", console.error.bind(console, "connection error:")); db.once("open", () => { console.log("Database connected"); }); const sample = (array) => array[Math.floor(Math.random() * array.length)]; const seedDB = async () => { await Campground.deleteMany({}); for (let i = 0; i < 50; i++) { const random1000 = Math.floor(Math.random() * 1000); const price = Math.floor(Math.random() * 20) + 10; const camp = new Campground({ location: `${cities[random1000].city}, ${cities[random1000].state}`, title: `${sample(descriptors)} ${sample(places)}`, image: "https://source.unsplash.com/collection/483251", description: "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quibusdam dolores vero perferendis laudantium, consequuntur voluptatibus nulla architecto, sit soluta esse iure sed labore ipsam a cum nihil atque molestiae deserunt!", price, }); await camp.save(); } }; seedDB().then(() => { mongoose.connection.close(); });
解决方案
核心问题是数据库操作早于连接完成时机执行。mongoose.connect()是异步操作,现有代码在调用连接后直接执行seedDB(),此时Mongoose还在缓冲数据库请求,超时后就会抛出错误。
方法一:在连接成功回调中执行操作
将seedDB()调用放到db.once("open")的回调内,确保数据库完全连接后再执行数据操作:
const mongoose = require("mongoose"); const cities = require("./cities"); const { places, descriptors } = require("./seedHelpers"); const Campground = require("../models/campground"); mongoose.connect("mongodb://127.0.0.1:27017/camp-spot"); const db = mongoose.connection; db.on("error", console.error.bind(console, "connection error:")); db.once("open", async () => { console.log("Database connected"); await seedDB(); mongoose.connection.close(); }); const sample = (array) => array[Math.floor(Math.random() * array.length)]; const seedDB = async () => { await Campground.deleteMany({}); for (let i = 0; i < 50; i++) { const random1000 = Math.floor(Math.random() * 1000); const price = Math.floor(Math.random() * 20) + 10; const camp = new Campground({ location: `${cities[random1000].city}, ${cities[random1000].state}`, title: `${sample(descriptors)} ${sample(places)}`, image: "https://source.unsplash.com/collection/483251", description: "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quibusdam dolores vero perferendis laudantium, consequuntur voluptatibus nulla architecto, sit soluta esse iure sed labore ipsam a cum nihil atque molestiae deserunt!", price, }); await camp.save(); } };
方法二:用async/await等待连接完成
通过mongoose.connect()返回的Promise等待连接建立,写法更简洁且支持错误捕获:
const mongoose = require("mongoose"); const cities = require("./cities"); const { places, descriptors } = require("./seedHelpers"); const Campground = require("../models/campground"); const sample = (array) => array[Math.floor(Math.random() * array.length)]; const seedDB = async () => { await Campground.deleteMany({}); for (let i = 0; i < 50; i++) { const random1000 = Math.floor(Math.random() * 1000); const price = Math.floor(Math.random() * 20) + 10; const camp = new Campground({ location: `${cities[random1000].city}, ${cities[random1000].state}`, title: `${sample(descriptors)} ${sample(places)}`, image: "https://source.unsplash.com/collection/483251", description: "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quibusdam dolores vero perferendis laudantium, consequuntur voluptatibus nulla architecto, sit soluta esse iure sed labore ipsam a cum nihil atque molestiae deserunt!", price, }); await camp.save(); } }; (async () => { try { await mongoose.connect("mongodb://127.0.0.1:27017/camp-spot"); console.log("Database connected"); await seedDB(); } catch (err) { console.error("Seeding failed:", err); } finally { mongoose.connection.close(); } })();
内容的提问来源于stack exchange,提问作者andrew shin
相关产品推荐
相关产品推荐

