Javascript express.js未等待循环
我想让用户详细了解json,但我的代码不等待循环 并打印{“个人聊天”:[]} 我想发送后循环 我如何解决这个问题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
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(…)