2016-04-27 83 views
1
router.post('/loginv', function (req,res) { 
    var id = req.body.id; 
    var pass = req.body.pass; 

    if(login.login(id,pass)=='validated'){ 
    res.sendfile('views/welcome.html'); 
    }else{ 
    res.send('dont give up'); 
    } 

    var result = login.login(id,pass); 
    console.log(result); 
}); 

module.exports={ 


    login : function(id,pass){ 
     var q = "SELECT * FROM user where id = ? and pass = ?"; 
     var ret = 'default'; 

     DB.DB.query(q, [id,pass], function (error,result) { 
      if(error){ 
       console.log('not found'); 
       ret = 'unrecognized'; 
      } else{ 
       console.log('found'); 
       ret = 'validated'; 
      } 
     }); 

     return ret; 
    }}; 

的console.log:變量沒有被覆蓋的NodeJS

GET /login 304 4.028 ms - - 
default 
POST /loginv 200 40.558 ms - 12 
found 
found 

,你可以看到RET從下面的代碼返回的值不被改變,雖然它遵循的程序功能正常.. 我是新來的節點js和js的東西,所以任何意見和建議一定會有所幫助thx :)

+0

'DB.query()'是異步,所以'login'函數在返回'ret'之前不會等待代碼的執行。您需要爲登錄方法添加回調(或使用承諾) – rpadovani

+2

換句話說,在完成查詢之前,登錄函數會返回。查詢數據庫是一種異步或非阻塞的I/O操作。 –

回答

1

DB.query()是異步的,所以login函數在返回ret之前不會等待代碼的執行。您需要向登錄方法添加回調(或使用承諾)。

一個工作代碼:

module.exports = { 
    login : function(id,pass,cb){ 
     var q = "SELECT * FROM user where id = ? and pass = ?"; 

     DB.DB.query(q, [id,pass], function (error,result) { 
      if(error){ 
       console.log('not found'); 
       cb(error, 'unrecognized'); 
      } else{ 
       console.log('found'); 
       cb(null, 'validated'); 
      } 
     }); 
    } 
}; 

其他文件:

router.post('/loginv', function (req,res) { 
    var id = req.body.id; 
    var pass = req.body.pass; 

    login.login(id,pass, function(err, result) { 
    if (err) { 
     console.log(err); 
     res.send('dont give up'); 
     return; 
    } 

    if (result === 'validated') { 
     res.sendfile('views/welcome.html'); 
    }else{ 
     console.log('Unknown error'); 
    } 
    }) 
}); 

我建議你閱讀的鏈接發佈herethis question它可以爲您提供有關回調和承諾的想法。

PS:我不知道你正在使用DB的庫,但你MUST淨化輸入做查詢之前,如果庫不爲你做

+0

它的作品!感謝您的幫助和鏈接真的有幫助..一直試圖解決這個問題幾個小時 – senaflix