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

Node.js与MySQL结合时Promise内forEach最后一项未插入数组问题

问题原因

  • 你的resolve()触发时机错误:testArray共7个元素,索引最后一位是6,对应子数组包含2个待查询的药品名称。当第一个药品的数据库查询返回、执行回调时,idx === array.length-1就会成立,直接触发resolve(),此时第二个药品的查询结果还没返回,自然没被push到数组里,所以最后一位缺失。
  • 循环内console.log(medIdArray)看起来正确是因为浏览器/Node.js的控制台打印引用类型时,展示的是你展开时的数组最新状态,不是打印那一刻的快照,你之后第二个查询完成push了值,控制台看到的就是更新后的完整数组,但then触发时第二个查询还没执行完,拿到的就是少一位的数组。

修复方案

把所有数据库查询包装成独立Promise,用Promise.all等待全部完成再返回结果,避免手动计数的错误:

let testArray = [
  ['Pantoprazol','Ibuprofen'],
  ['Pantoprazol','Ibuprofen'],
  ['Pantoprazol','Ibuprofen'],
  ['Pantoprazol','Ibuprofen'],
  ['Pantoprazol','Ibuprofen'],
  ['Pantoprazol','Ibuprofen'],
  ['Pantoprazol','Ibuprofen'],
];

let sqlGetMedId = "SELECT MedikamentId FROM Medikament WHERE Bezeichnung = ?";
// 把所有查询任务平铺出来,每个包装成Promise
const queryPromises = testArray.flat().map(medName => {
  return new Promise((resolve, reject) => {
    mySqlConnection.query(sqlGetMedId, medName, (err, rows) => {
      if(err) return reject(err);
      resolve(rows[0].MedikamentId);
    })
  })
})

Promise.all(queryPromises)
  .then(medIdArray => {
    // 这里拿到的就是完整顺序的id数组
    console.log(medIdArray);
  })
  .catch(err => {
    console.log(err);
  })

内容的提问来源于stack exchange,提问作者durikr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:45:01