2016-08-14 17 views
0

My Expressアプリケーションでは、このコントローラメソッドを使用して、モデル関数を呼び出し、NeDBのfindメソッドを使用してドキュメントデータベースファイルを検索します。ここに検証メソッドがあります。NeDBのメソッドの非同期性を扱う方法は?

verify : function(username, password) { 
    db.find({ email: username }, function (err, docs) { 
     return passwordHash.verify(password, docs[0].password); 
    }); 
}, 

ここに、関数を呼び出すコードがあります。

post_admin : function(req, res) { 
if (!req.body.email || !req.body.password) { 
    res.render('login', { title: 'Please provide your login details' }); 
    }else if(''!=req.body.email && ''!=req.body.password){ 
    var i = User.verify(req.body.email, req.body.password); 
    if(i){ 
     res.render('admin/dashboard', { title: 'Successfully Logged In' }); 
    }else{ 
     res.render('login', { title: 'Not correct details!' }); 
    } 
    }else{ 
    res.render('login', { title: 'Not correct details!' }); 
    } 
}, 

...ただし、ファイルにあるデータと一致してもtrueを返してもfalseを返します。 db.findメソッド内でコンソールを操作すると、trueが表示されますが、verifyメソッドはfalseを返します。その結果、条件ブロックは常にelse部分を実行します。私が両方をコンソールにすると、db.findが何かを記録する前に条件が実行されるのがわかります。これはプログラミングの非同期性のためですか?私はどのビューをコントローラ内でレンダリングすべきかを判断する必要があるので、これをどのように処理すればよいでしょうか。ここでJavascriptの非同期性を損なうことなくこれを行う方法はありますか?私は明白な何かを欠いていますか

答えて

0

verifyは非同期関数であるので、私はcallback

verify : function(username, password, callback) { 
    db.find({ email: username }, function (err, docs) { 
     callback(passwordHash.verify(password, docs[0].password)); 
    }); 
} 
... 
post_admin : function(req, res) { 
    if (!req.body.email || !req.body.password) 
     return res.render('login', { title: 'Please provide your login and password details' }); 

    User.verify(req.body.email, req.body.password, function(isOk) { 
     return (isOk) ? 
       res.render('admin/dashboard', { title: 'Successfully Logged In' }) : 
       res.render('login', { title: 'Not correct details!' }); 
    }); 
}, 
を追加します
関連する問題