Node JS没有更新“全局变量”

时间:2017-03-04 17:40:47

标签: node.js azure

我对代码的预期用途是检查数据库是否具有以对象User形式传递给函数的用户名和密码。

我将success变量初始化为false。然后我说如果我找到记录,那么我会将其设置为true。但是,即使找到记录,成功变量仍然是假的。变量似乎没有更新。为什么? 另外,我怎样才能传回整个fetcheduser结果,同时我可以指出是否找到了记录?非常感谢

LoginSuccess : function (User) {

    var success = false;
    function isEmptyObject(obj) {
        return !Object.keys(obj).length;
    }

    function isEmptyObject(obj) {
        for (var key in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, key)) {
                return false;
            }
        }
        return true;
    }
    var sql = require('mssql');
    var config = require('./configuration/sqlconfig');
    var fetcheduser;
    sql.connect(config).then(function () {
        console.log('Connected to DB');
        new sql.Request().query("SELECT * FROM dbo.LocalUser WHERE Username = '" + User.username + "' AND Password = '" + User.password + "';")
            .then(function (recordset) {
                if (isEmptyObject(recordset)) {
                    console.log("The User does not exist");
                } else {
                    fetcheduser = JSON.parse(JSON.stringify(recordset));
                    success = true;
                    console.log("The user is existed.");
                }
            }).catch(function (err) {
                //When errors come
            });
    }); 
    return success;
}

2 个答案:

答案 0 :(得分:0)

您需要返回您的承诺才能获得正确的success州。像这样......

function LoginSuccess() {
  var success = false;

  return sql.connect(config)
    .then(() => {
      return new sql.Request().query(...).then(
        () => success = true,
        () => success = false
      );
    })
    .then(() => {
      return success;
    });

}

LoginSuccess().then(success => ...);

答案 1 :(得分:0)

实际上 - 变量正在更新,但是太晚了 - 退回之后。尝试制作downloadUrl并在返回后立即检查result = { success: false },并在5秒后(或任何适当的时候)检查result,您会看到它已更改:setTimeout(() => console.log(result), 5000)

无论如何,为了生产,请寻求诺言解决方案。节点7.6终于现在异步/等待,所以你可以摆脱丑陋的...then变通办法。