2017-03-04 86 views
0

我的代碼的用途是檢查數據庫是否有一個用戶名和密碼以對象User的形式傳遞給函數。節點JS沒有更新「全局變量」

我將成功變量初始化爲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; 
} 
+1

讓我問你這個問題:首先:將成功設置爲true,還是返回結果?提示:這可能不是你的想法。另外,你的select語句對於注入攻擊已經成熟 - 想起Bobby Tables ... – Krease

+0

它是異步的:在成功設置爲true之前返回成功。 – bugovicsb

+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 => ...); 
0

實際上 - 變量正在更新,但方式太晚 - 在您返回它之後。嘗試撥打result = { success: false }和返回後立即檢查result和5秒後(或其他適當的),你會看到,它已經改變了:setTimeout(() => console.log(result), 5000)

不管怎麼說,生產,去承諾的解決方案。節點7.6現在終於異步/等待,所以你可以擺脫醜陋的...then變通辦法。