遍历嵌套对象数组向MongoDB写数据时forEach/for of报错如何修复
代码修复方案
核心错误原因
- 遍历取值错误:forEach回调的第一个参数、for...of迭代返回的变量都是数组的当前元素对象本身,不是数组索引,不需要再通过
leagues[变量]二次取值 - Mongoose方法调用错误:
save()是模型实例的方法,不能直接调用League.save(),要先将new League()创建的实例赋值给变量,再调用该实例的save()方法 - forEach异步兼容问题:forEach原生不支持async/await阻塞,即使回调写了async也会同时触发所有异步操作,容易引发数据库连接异常,遍历执行异步任务优先使用for...of
修复后的for...of版本(推荐)
const seedDB = async () => { await League.deleteMany({}); for (let aLeague of leagues) { const seedLeague = new League({ title: aLeague.title, location: aLeague.location, city: aLeague.city, lat: aLeague.lat, lon: aLeague.lon }); await seedLeague.save(); } };
修复后的forEach兼容版本
如果需要使用遍历方法实现,要配合Promise.all等待所有异步操作完成:
const seedDB = async () => { await League.deleteMany({}); await Promise.all(leagues.map(async (leagueItem) => { const seedLeague = new League({ title: leagueItem.title, location: leagueItem.location, city: leagueItem.city, lat: leagueItem.lat, lon: leagueItem.lon }); await seedLeague.save(); })); };
更高效的优化方案
Mongoose内置了批量插入方法insertMany,不需要手动循环插入,性能更好:
const seedDB = async () => { await League.deleteMany({}); // 直接传入完整的leagues数组即可完成批量插入 await League.insertMany(leagues); };
内容的提问来源于stack exchange,提问作者Zizo
相关产品推荐
相关产品推荐

