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的异步性质的情况下执行此操作?我错过了一些明显的东西吗?
答案 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!' });
});
},