如何处理NeDB查找方法的异步性?

时间:2016-08-14 19:58:00

标签: javascript node.js express model-view-controller

My Express应用程序使用此控制器方法调用模型函数 verify ,该函数使用NeDB的find方法在文档数据库文件中查找。这是验证方法..

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!' });
  }
},

...但即使它匹配文件中找到的数据也会返回false,并返回true。当我在 db.find 方法中进行控制时,它显示为true但是,验证方法返回false。结果,条件块总是执行else部分。当我同时控制两个时,我看到在 db.find 记录任何内容之前执行了条件。这是由于编程的异步性质吗?我应该如何处理这个因为我需要确定应该在控制器中呈现哪个视图!有没有办法在不破坏Javascript的异步性质的情况下执行此操作?我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分: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!' });
    });
},