我正在学习NodeJS,我有以下代码:
var test = '';
function test2(name,callback) {
UserData
.findOne({'token': name})
.then(function(user) {
test = user.token;
console.log('current: '+user.token);
return callback(user.token);
})
.catch(function(err) {
console.log(err);
});
}
var isAuthenticated = function(req,res,next){
test2(req.cookies.remember_me, function(user) {test=user; });
console.log('test:::: '+test);
var isLog = false;
if(req.session.user!= undefined && req.session.user===test){
isLog=true;
}
if(req.cookies.remember_me ===test){
console.log('test'+test);
isLog=true;
}
if(isLog){
return 1;
}else
{
console.log('not auth');
return -1;
}
}
结果是:
test :::: P9Ysq2oSCHy1RVyWsePxJhpEYLD81qOiIayTyiNJCnOkmllvEspwrDAW8tD9rmfJ
不是auth
当前:k8LJcCty6568QpXNS3urBedlJ0MDfEYlbOqo9Q7tQi9EOyeSkyesgHHzUjBhDgZx
我知道如果NodeJS的异步性质,但我怎样才能使测试始终与' current';
相同谢谢。
答案 0 :(得分:0)
你正在犯一个相当经典的错误,希望代码能够按照所写的顺序运行,但由于javascript的异步特性,它并没有。例如:
test2(req.cookies.remember_me, function(user) {test=user; });
console.log('test:::: '+test);
此处您的console.log()
将在回调之前运行,因为回调仅在您从数据库收到回复后才会发生。 (虽然不清楚测试值(' P9Ysq2oSCH ......')来自哪里。
只要您正在学习Node,就应该首先尝试避免混合回调和承诺。您的findOne()
函数会返回一个承诺,这就是您可以在其上调用then()
的原因。您应该返回此承诺,然后在调用函数中调用then()
:
function test2(name) {
// return is important - you're returning the promise which you will use later.
return UserData.findOne({'token': name})
.then(function(user) {
return user.token;
})
.catch(function(err) {
console.log(err);
});
}
function isAuthenticated(req,res,next){
return test2(req.cookies.remember_me)
.then(function(token) {
console.log('test:::: '+token);
var isLog = false;
if(req.session.user!= undefined && req.session.user===token){
isLog=true;
}
if(req.cookies.remember_me ===token){
isLog=true;
}
return isLog
})
}
// Use the function
isAuthenticated(req,res,next)
.then(function(isLoggedin){
if(isLoggedin) {
// user logged in
} else {
// not logged in
}
})