簡體   English   中英

Node / JS承諾被阻止

[英]Node / JS promises blocked

這是Node / JS的新功能,我正在為一個現有的IT門戶創建密碼恢復頁面,它會搜索AD(ldap)和用戶已注冊的數據庫。 根據兩者的結果,用戶可以選擇進行身份驗證,然后更改密碼

當我從客戶端發出請求($ get())來查找用戶時,后端會間歇性地停頓。 請參閱下面的控制台日志記錄

這是控制台日志記錄

Attempting to find : <account name>
Found AD user: <account name>
in acc prep
in sql request
in getUserRegistration //within auth controller

.
.here it prints the results of the sql query // At this point I would expect the promise to be fulfilled.
.

這是花時間做誰知道的地方。 最終完成,但通常需要幾分鍾。 然后打印...

in sql results

停滯似乎是在then()內部調用return auth.getUserRegistration(globalUser.sql)之后。 來自auth控制器的日志記錄非常迅速地記錄了來自sql查詢的結果,該結果恰好在應解決之前,因此將結果返回到隨后的then()。 所以我不相信auth控制器(它可以完美地獨立工作)不會有問題,而是在resolve()中存在問題。 也許因為它在另一個承諾之內?

我發現有趣和困惑的是,如果我從另一個選項卡/瀏覽器瀏覽到門戶,則后端工作完成並且頁面立即呈現。

見下面的代碼

/* Client request */

$.get(urlqry, function(result) {
  if (result.match("<div id=\"pop\">")) {

    $.modal(result, {
        onClose: function () {
          $("[id^=simplemodal").remove();
          $("#findload").hide();
          $("#forgetbtn").show();
          $.modal.close();
      }
    });

  } else {
    console.log("in else");
    $("#divid").html(result)
  }

});

/* 
this is the route that renders based the work from 2 different controllers
1. check if user exists in Active Directory (ldap)
2. check if user has registered (sql)
*/

router.get('/forgetpwd', function(req, res) {

  var usrname = req.query.usr
  var domain = req.query.realm

  if (usrname && domain) {

    console.log("Attempting to find : " + usrname + "@" + domain);

    var globalUser = {
      username: "",
      upn: "",
      accounts: [],
      sql: {},
      registered: false
    }

    ad.getUser(usrname, domain)

    .then(function(result) {
      if (result.userPrincipalName) {

        console.log("Found AD user: " + result.userPrincipalName);

        globalUser.username = result.sAMAccountName
        globalUser.upn = result.userPrincipalName
        globalUser.accounts = result.extensionAttribute15

      } else {

        var fail = {
          status: "fail",
          message: "Unknown Error"
        }

        var msg = result ? result : fail

        throw msg;

      }

    })

    .then(function(result) {
        console.log("in acc prep");

        globalUser.sql.username = globalUser.username
        var upns = globalUser.accounts

        if (upns) {
          upns = upns.split(",")

          for (u in upns) {

            var upn = upns[u].split("@")
            var domain = upn.slice(-1)[0].toLowerCase()

            switch (domain) {
              case "domain1":
                globalUser.sql.domain1UPN = upns[u]
                break;
              case "domain2":
                globalUser.sql.domain2UPN = upns[u]
                break;
              case "domain3":
                globalUser.sql.ihUPN = upns[u]
                break;
              default:
                globalUser.accounts = ""
                break;
            }
          }
        } else {
          globalUser.accounts = ""
        }
        return;

      })

    .then(function(result) {
      console.log("in sql request");

      return auth.getUserRegistration(globalUser.sql)

    })

    .then(function(result) {

      console.log("in sql results");

      if (result.length > 0) {

        globalUser.registered = true
        return

      } else {

        globalUser.registered = false
        return

      }

    })

    .then(function(result) {

      var accounts = {
        username: globalUser.username,
        accounts: globalUser.accounts.split(","),
        registered: globalUser.registered

      }

      console.log(accounts);
      res.render('./forget-options', accounts);

    })

    .catch(function(error) {
      console.log("in catch");
      var failure = {
        status: "fail",
        message: error

      }
      console.log(failure);
      res.render("./ack", failure);
      return

    })

  } else {

    console.log("User field empty and/or Domaim no selected");

  }
});

/*
Checks if a a record exist in a DB based on results from ad.getUser
requires edge/edge-sql
*/

auth.getUserRegistration = function(accounts) {
  return new Promise(function(resolve, reject) {

    var query = "select * from [users] where (username = "
    query += "\'" + accounts.username + "\'"
    if (accounts.domain2UPN) {
      query += " or domain2UPN = \'" + accounts.domain2UPN + "\'"
    }
    if (accounts.domain1UPN) {
      query += " or domain1UPN = \'" + accounts.domain1UPN + "\'"
    }

    query += ") and q1col is not null and q2col is not null and pin is not null;"

    var sqlparams = {
      connectionString: "Data Source=name.domain.com;Initial Catalog=dbname;Integrated Security=True",
      source: query
    };

    var getReg = edge.func('sql', sqlparams);

    getReg(null, function(error, result) {

      if (error) {

        console.log("Retrieving user ?? registration");
        reject(error);

      } else {

        console.log("in getUserRegistration");
        console.log(result);
        resolve(result);

      }
    });
  });
}

我最終將數據庫模塊從edge-sql更改為mssql,並相應地更新了我的代碼。 它立即起作用。

auth.getUserRegistration = function(accounts) {
  return new Promise(function(resolve, reject) {

    var query = "select * from [users] where (username = "
    query += "\'" + accounts.username + "\'"
    if (accounts.domain2UPN) {
      query += " or domain2UPN = \'" + accounts.domain2UPN + "\'"
    }
    if (accounts.domain1UPN) {
      query += " or domain1UPN = \'" + accounts.domain1UPN + "\'"
    }

    query += ") and q1col is not null and q2col is not null and pin is not null;"

    sql.connect("mssql://<usr>:<pwd>@<server>/<db>").then(function() {         
        new sql.Request().query(query).then(function(recordset) {
            console.log(recordset);
            resolve(recordset);
        }).catch(function(err) {
            console.log(err);
        });

    }).catch(function(err) {
            console.log(err);
        });
    });
  });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM