Nodejs:在查询执行期间等待API响应

时间:2021-06-09 07:02:51

标签: node.js express

我正在接收来自用户的电子邮件并在数据库 (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.....
          }
          ........

任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

您对远程 API 服务器的请求是一个流。流将接收有关块的数据并在完成时触发事件 end。与承诺或回调类似,异步代码将在稍后执行并获得响应,这意味着密码检查将在触发 end 事件之前执行。
您有两种处理方法:

  1. 将所有代码移到 end 事件中
  2. 如果 http.get 函数可以返回包含整个负载的 Promise,请考虑将 conn.query 回调函数更改为异步函数,这样您就可以先等待 http.get 函数的响应并在您的密码检查器方法中使用响应