Campground.deleteMany()执行10秒仍缓冲,需每次运行重置营地数据
解决Campground.deleteMany()执行缓冲的问题
问题根源分析
你的代码存在几个可能导致操作阻塞的点:
- 数据库连接未完全就绪就执行数据库操作
- 缺少错误捕获机制,无法定位潜在报错
- 循环中逐个保存文档,多次数据库请求拖慢执行速度
解决方案步骤
1. 确保数据库连接就绪后再执行操作
当前代码中seedDB()直接在全局作用域调用,可能在数据库连接还没完全建立时就开始执行deleteMany,导致操作挂起。需要将seedDB的调用放到数据库连接成功的回调中:
db.once("open", async ()=>{ console.log("Database connection open") await seedDB(); mongoose.connection.close(); })
2. 添加错误捕获机制
在seedDB函数中加入try/catch,捕获并打印错误,方便排查问题:
const seedDB = async()=>{ try { await Campground.deleteMany({}); // 后续生成数据的逻辑... } catch (err) { console.error("Seed DB error:", err); } }
3. 改用批量插入提升效率
循环中逐个await camp.save()会发起50次数据库请求,改用Campground.insertMany()批量插入,大幅减少请求次数,提升执行速度:
const seedDB = async()=>{ try { await Campground.deleteMany({}); const camps = []; for(let i=0; i<50; i++){ const random1000 = Math.floor(Math.random() * 1000) const price = Math.floor(Math.random()*20)*10 camps.push({ author:'63dbcd28bd0379985929400c', 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. Delectus labore magnam reiciendis ex corrupti, nobis, obcaecati alias laboriosam voluptatum, cumque dignissimos accusamus? Voluptatibus accusamus voluptatum nulla vel doloribus, delectus voluptatem?", price }) } await Campground.insertMany(camps); } catch (err) { console.error("Seed DB error:", err); } }
修改后的完整代码
const path = require('path') const mongoose = require('mongoose') const cities = require('./cities') const Campground = require('../views/models/campground') const {descriptors,places} = require('./seedhelpers') mongoose.connect('mongodb://localhost:27017/yelp-camp', { useNewUrlParser:true, useUnifiedTopology:true }) const db = mongoose.connection; db.on("error", console.error.bind(console, "connection ERROR")); db.once("open", async ()=>{ console.log("Database connection open") await seedDB(); mongoose.connection.close(); }) const sample = array => array[Math.floor(Math.random() * array.length )] const seedDB = async()=>{ try { await Campground.deleteMany({}); const camps = []; for(let i=0; i<50; i++){ const random1000 = Math.floor(Math.random() * 1000) const price = Math.floor(Math.random()*20)*10 camps.push({ author:'63dbcd28bd0379985929400c', 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. Delectus labore magnam reiciendis ex corrupti, nobis, obcaecati alias laboriosam voluptatum, cumque dignissimos accusamus? Voluptatibus accusamus voluptatum nulla vel doloribus, delectus voluptatem?", price }) } await Campground.insertMany(camps); console.log("Seed data inserted successfully") } catch (err) { console.error("Seed DB error:", err); } }
额外排查点
- 检查MongoDB服务是否正常运行:在终端执行
mongod确认服务启动 - 验证
Campground模型定义是否正确,确保没有字段约束导致操作失败 - 查看MongoDB日志,定位是否有数据库层面的错误
内容的提问来源于stack exchange,提问作者Hari
相关产品推荐
相关产品推荐

