Javascript express.js未等待循环

Javascript express.js未等待循环,javascript,express,Javascript,Express,我想让用户详细了解json,但我的代码不等待循环 并打印{“个人聊天”:[]} 我想发送后循环 我如何解决这个问题 connection.query("SELECT * FROM personalchat WHERE user1ID = ? OR user2ID = ?", [userID, userID], function(err, row, fields) { if (err) console.log(err); else { personalchats = Ar

我想让用户详细了解json,但我的代码不等待循环 并打印{“个人聊天”:[]}

我想发送后循环

我如何解决这个问题

connection.query("SELECT * FROM personalchat WHERE user1ID = ? OR user2ID = ?", [userID, userID], function(err, row, fields) {
  if (err)
    console.log(err);

  else {
    personalchats = Array();

    for (var i = 0; i < row.length; i++) {
      if (row[i].user1ID != userID)
        user2ID = row[i].user1ID;
      else
        user2ID = row[i].user2ID;

      connection.query("SELECT * FROM users WHERE userID = ?", [user2ID], function(err2, row2, fields2) {
        if (err)
          console.log(err2);

        else {


          personalchats.push({
            'success': true,
            'userID': row2[0].userID,
            'name': row2[0].name,
            'surname': row2[0].surname,
            'email': row2[0].email
          });
          console.log(personalchats);
        }


      });

    }

    res.send({
      "personalchats": personalchats
    });
  }

});
connection.query(“从personalchat中选择*,其中user1ID=?或user2ID=?”,[userID,userID],函数(err,row,fields){
如果(错误)
控制台日志(err);
否则{
personalchats=Array();
对于(变量i=0;i
您遇到了异步问题。您对数据库的调用需要一段时间才能完成,并且很有可能在尝试发送数据之前没有收到响应并运行回调。在这种情况下,使用“Promise.all”可能是一个好主意,或者构建某种类型的函数,在将每个项推送到回调中的数组后运行,该数组将在发送快速响应之前检查是否已收到所有响应。

您的代码是异步的。第一个
connection.query
通过调用回调
函数(err,row,fields){}
返回结果

第二个查询还通过调用回调函数
函数(err2,row2,fields2){}
返回。您可以从该回调函数中读取值。您可以登录为
console.log(个人聊天)
。您还必须将结果发送到该回调函数中

  personalchats.push({
    'success': true,
    'userID': row2[0].userID,
    'name': row2[0].name,
    'surname': row2[0].surname,
    'email': row2[0].email
  });
  console.log(personalchats);
  res.send({
    "personalchats": personalchats
  });
否则,
row2
的值在回调外部将不可用

您应该在
连接后发送结果。查询
成功。完整示例:

connection.query("SELECT * FROM personalchat WHERE user1ID = ? OR user2ID = ?", [userID, userID], function(err, row, fields) {
  if (err)
    console.log(err);

  else {
    personalchats = Array();

    for (var i = 0; i < row.length; i++) {
      if (row[i].user1ID != userID)
        user2ID = row[i].user1ID;
      else
        user2ID = row[i].user2ID;

      connection.query("SELECT * FROM users WHERE userID = ?", [user2ID], function(err2, row2, fields2) {
        if (err)
          console.log(err2);

        else {


          personalchats.push({
            'success': true,
            'userID': row2[0].userID,
            'name': row2[0].name,
            'surname': row2[0].surname,
            'email': row2[0].email
          });
          console.log(personalchats);
          res.send({
            "personalchats": personalchats
          });
        }


      });

    }


  }

});
connection.query(“从personalchat中选择*,其中user1ID=?或user2ID=?”,[userID,userID],函数(err,row,fields){
如果(错误)
控制台日志(err);
否则{
personalchats=Array();
对于(变量i=0;i
使用以下代码:

connection.query("SELECT * FROM personalchat WHERE user1ID = ? OR user2ID = ?", [userID, userID], function(err, row, fields) {
  if (err)
    console.log(err);

  else {
      personalchats = [];
      var userIDs = [];

      for (var i = 0; i < row.length; i++) {
        if (row[i].user1ID != userID)
          userIDs.push(row[i].user1ID);
        else
          userIDs.push(row[i].user2ID);
      }

      connection.query("SELECT * FROM users WHERE userID in (" + userIDs.join(',') + ")", function(err2, row2, fields2) {
        if (err)
          console.log(err2);

        else {

          row2.forEach(r =>
            personalchats.push({
              'success': true,
              'userID': r.userID,
              'name': r.name,
              'surname': r.surname,
              'email': r.email
            });
          })
          console.log(personalchats);
          res.send({
            "personalchats": personalchats
          });
        }
      });
    }
  }
});
connection.query(“从personalchat中选择*,其中user1ID=?或user2ID=?”,[userID,userID],函数(err,row,fields){
如果(错误)
控制台日志(err);
否则{
个人聊天=[];
var userIDs=[];
对于(变量i=0;i
推送({
"成功":对,,
“userID”:r.userID,
“name”:r.name,
“姓”:r.姓,
“电子邮件”:r.email
});
})
console.log(个人聊天);
res.send({
“个人聊天”:个人聊天
});
}
});
}
}
});

最有可能是
连接。query
返回一个承诺,因此您可以在其上和回调内部使用
res.send({personalchats:personalchats})
。这种方法将只为一个用户发送信息。之后,您可以改进
Promise.all
的解决方案,并在每次迭代中创建一个承诺数组,例如
promises.push(connection)
。然后使用
Promise.all(promises)。然后(()=>res.send(…)