You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中ForEach重复执行导致MySQL查询结果重复的问题

数据重复的根因
  • 写了两层完全重复的全量遍历:外层是for (let i = 0; i < res.length; i++),会按结果长度循环2次;循环内部又套了res.forEach,每触发一次外层循环,就会把整个结果集从头遍历一遍、把每条数据push进serverInfo。最终push的总数就是2*2=4,和控制台看到的重复结果完全吻合。
  • 附带两个逻辑小问题:
    1. 名称替换顺序写反了:代码是先把原始name值push进数组,之后才判断如果name是"Server"要改成"Server in use",改完的变量根本没用到,这段替换逻辑等于白写。
    2. 全局的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 09:06:04