NodeJS回调变量赋值总是一个更新

时间:2017-10-29 16:31:22

标签: node.js asynccallback

我正在学习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';

相同

谢谢。

1 个答案:

答案 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
    }
})