本质上,我有一个带有字符串键和值的对象(例如{"michigan":"minnesota"}),. I试图遍历所有这些键值对并从数据库中进行查询,然后将结果添加到列表中,然后将返回到前端。

var return_list = []

        Object.keys(obj).forEach(function(key){
            const state1 = key;
            const state2 = obj[key];

            const sql_select = 'SELECT column1,column2 from database WHERE state = ? OR state=?';
        
            db.query(sql_select,[state1,state2], (err,result) => {
                
                return_list.push(result);
            });
        })

用最简单的话来说,这就是我想要的,并且希望将return_list发送回前端。我遇到的问题是我可以在db.query调用中console.log结果,但是我不能将结果推送到列表或在查询之外的任何地方调用它。我对前端和后端开发都还很陌生,因此任何可能的想法肯定会有所帮助!

分析解答

问题是forEach返回void。
因此,您不能等异步代码运行后再返回。
当我们处理一系列承诺时,例如db查询(如您的案例)或API调用,我们应该等待它们中的每一个都被执行。
那就是我们使用Promise.all的时候

尝试这样做:

const queryResults = await Promise.all(
   Object.keys(obj).map(async (key) => {
    const state1 = key;
    const state2 = obj[key];

    const sql_select = 'SELECT column1,column2 from database WHERE state = ? OR state=?';

    return new Promise((resolve, reject) => 
      db.query(sql_select,[state1,state2], (err, result) => {
        if (err) 
          return reject(err)
        else
          return resolve(result)
      })
    )
  })
)
console.log('queryResults', queryResults)
// now you give this queryResults back to your FE

重新开始的小技巧:

  • 永远不要使用var,请尝试始终使用const;如果需要,请让。
  • 尝试始终使用箭头功能() => {...})而不是常规函数(function () {...}),很难预测最后一个正在使用哪个范围