Node.js中ForEach重复执行导致MySQL查询结果重复的问题
数据重复的根因
- 写了两层完全重复的全量遍历:外层是
for (let i = 0; i < res.length; i++),会按结果长度循环2次;循环内部又套了res.forEach,每触发一次外层循环,就会把整个结果集从头遍历一遍、把每条数据push进serverInfo。最终push的总数就是2*2=4,和控制台看到的重复结果完全吻合。 - 附带两个逻辑小问题:
- 名称替换顺序写反了:代码是先把原始name值push进数组,之后才判断如果name是"Server"要改成"Server in use",改完的变量根本没用到,这段替换逻辑等于白写。
- 全局的
serverInfo数组没有重置机制:如果loadInfo被调用多次,之前存的旧数据会一直残留在数组里,越攒重复越多。
修正后的代码
let serverInfo = []; loadInfo: function(){ // 每次加载先清空旧数据,避免多次调用累积残留 serverInfo = []; gm.mysql.handle.query('SELECT * FROM `info`', [], function(err, res, row){ if(err) { console.log(err); return; } if(res.length){ // 单层遍历即可,不需要嵌套两层 res.forEach(function(zData){ let id = zData.id; let name = zData.name; let color = zData.color; let icon = zData.icon; // 先做名称判断替换,再把处理后的值push进数组 if(name === "Server") { name = "Server in use"; } serverInfo.push({id: id, name: name, color: color, icon: icon}); }); } console.log("Loaded "+serverInfo.length+" servers."); console.log(serverInfo); }); }
内容的提问来源于stack exchange,提问作者Hidro
相关产品推荐
相关产品推荐

