2016-04-27 6 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は()'非同期であるあなたのためにそれをしない場合は、MUSTは、クエリを実行する前に入力をサニタイズ、 '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'); 
    } 
    }) 
}); 

私はリンクを読むことをお勧めはhere、あなたのコールバックとの約束についての考えを与えることができますthis question掲載しました。

PS:私はあなたがDBのために使用しているライブラリを知りませんが、ライブラリは

+0

それは動作します!あなたの助けとリンクが本当に役立つおかげで..何時間もこの問題を解決しようとしてきた – senaflix

関連する問題