我正在接收来自用户的电子邮件并在数据库 (DB2) 中进行检查。之后,我发送 HTTP get 请求以进一步验证来自远程服务器的电子邮件。之后,我正在执行查询以验证用户密码。但是,我在这里面临竞争条件。我的密码验证查询开始执行,无需等待来自远程服务器的 API 响应。我该如何解决?
这是我的代码:
conn.query(searchDB, [email], (err, results) => {
if(!err)
{
if(results.length == 0)
{
res.send("UnAuthorized");
}
else
{
// I get the response from the below request
samaccount = results[0].samaccount;
http.get(`API-endpoint/${samaccount}`, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
newdata = JSON.parse(data);
if(newdata.accountStatus == true)
{
samaccountvalid = true;
console.log("User Authorized as per sam account");
}
else
{
samaccountvalid = false;
console.log("User NOT Authorized as per sam account");
return;
}
});
}).on("error", (err) => {
console.log("Error: " + err.message);
});
//at the same time this starts executing I want to wait for the above request to complete
if(samaccountvalid == true)
{
console.log("Password is being compared");
.....comparing password here.....
}
........
任何帮助将不胜感激。谢谢!
答案 0 :(得分:1)
您对远程 API 服务器的请求是一个流。流将接收有关块的数据并在完成时触发事件 end
。与承诺或回调类似,异步代码将在稍后执行并获得响应,这意味着密码检查将在触发 end
事件之前执行。
您有两种处理方法:
end
事件中http.get
函数可以返回包含整个负载的 Promise,请考虑将 conn.query
回调函数更改为异步函数,这样您就可以先等待 http.get
函数的响应并在您的密码检查器方法中使用响应