2017-07-27 23 views
0

大家好我已經使用express創建了一個基本nodesjs服務器。 有一個用戶發送的登錄頁面,它從Sqlite3數據庫檢查條目。 我的查詢是回調函數只有在其父功能完成後才起作用。 但是在以下情況下,由於db的db.each命令需要一些時間,所以回調函數不會提供所需的輸出。但是如果我設置超時功能,它會給出一個合適的答案。Javascript回調

代碼剪斷 /* POST請求用戶登陸頁面被稱爲*/

app.post('/userLogin',function(req,res){ 
    checkLogin(req,function(){//using a callback 
    setTimeout(function(){//delaying the execution of this part** 
    if(userLoginStatus=='SUCCESS'){res.render('userLogin');} 
    else{res.send('Wrong credentials');} 
    },100); 
    }); 
}); 


function checkLogin(req,callback){ 
    db.serialize(function(){ 
    db.each("SELECT * from USERLOGIN where USERID ='"+req.body.userId+"'"+ 
    " AND PASSWORD='"+req.body.password+"'",function(err,row){ 
    if(row.USERID.length>0){userLoginStatus ='SUCCESS';} 
    else {userLoginStatus = 'UNSUCCESFUL';} 
    }); 
    }); 
    callback(); 
} 
+0

很可能你需要將這些調用鏈接在一起。你應該閱讀關於帶有回調的Javascript異步調用。閱讀承諾也很有趣:-) – flob

回答

0

你需要把你的回調在db.each功能的回調,所以它運行在您從得到的數據數據庫:

function checkLogin(req, callback) { 
    db.serialize(function() { 
     db.each("SELECT * from USERLOGIN where USERID ='" + req.body.userId + "'" + 
      " AND PASSWORD='" + req.body.password + "'", 
      // This is the db.each callback function 
      function (err, row) { 
       if (row.USERID.length > 0) { 
        userLoginStatus = 'SUCCESS'; 
       } 
       else { 
        userLoginStatus = 'UNSUCCESFUL'; 
       } 
       // you need to call your callback INSIDE of the db.each callback 
       callback(); 
      }); 
     // Placing it here is wrong, because it will be executed before db.each is completed 
     // callback(); 
    }); 
} 
+0

確實,回調是解決這個問題的一種方式,但不應該使用全局變量('userLoginStatus')傳遞該值,而應該將其作爲回調的第二個參數。 –

+0

@ t.niese那不是問題的一部分,他可能需要其他地方的全局變量。 – Danmoreng

+0

謝謝Danmoreng,它爲我工作。應該注意回調的位置。 –