2017-10-29 1 views
0

내가 배우고 NodeJS 뒤에 한 업데이트입니다 콜백 나는 다음과 같은 코드가 있습니다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; 
    } 
} 

을하고 그 결과는 다음과 같습니다

시험 :::: P9Ysq2oSCHy1RVyWsePxJhpEYLD81qOiIayTyiNJCnOkmllvEspwrDAW8tD9rmfJ 하지

현재 정식 : k8LJcCty6568QpXNS3urBedlJ0MDfEYlbOqo9Q7tQi9EOyeSkyesgHHzUjBhDgZx

NodeJS의 비동기 성격이라면 bcause를 알지만 어떻게하면 항상 'current'와 동일한 테스트를 할 수 있을까요?

감사합니다.

+0

. 당신을 위해서해라.이 지저분한 코드를 가지고있는 이유는 전혀 없다. – Tomalak

답변

0

작성된 순서대로 코드가 실행될 것이라고 기대하는 것은 꽤 고전적인 실수이지만 JavaScript의 비동기 특성 때문에 발생하는 것은 아닙니다. 예를 들면 :

test2(req.cookies.remember_me, function(user) {test=user; }); 
console.log('test:::: '+test); 

당신이 다시 DB에서 들어 본 후 콜백에만 발생하기 때문에 여기 console.log() 콜백 전에 실행됩니다. (테스트 값 ('P9Ysq2oSCH ...')의 출처가 명확하지 않더라도

노드를 학습하는 중이라면 콜백 및 약속 믹싱을 피하면서 시작해야합니다. 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 
    } 
}) 
당신은 제대로 코드 들여 쓰기를 시작할 수 있습니다 지금 도구가함으로써 그 수
+0

답장을 보내 주셔서 감사합니다. 1. 테스트의 초기 값이 없습니다. gener에 토큰 값이 없습니다. ated하고 로그인 할 때 저장했습니다. (여러 번로드 한 이유는 test에 x 값이있는 이유입니다.) 2. 'isAuthenticated'변수에 remember_me 값이 token과 일치하면 'not ok'는 -1, 'ok'는 1을 반환해야합니다. 또한 (중요) 동일한 함수에서 'test2'에 대해 여러 번 호출해야합니다 (가능하면). 전에 NodeJS가 좋았습니다. 또한 순진한 해결 방법 : https://pastebin.com/WjnAxHHu 오늘 수업 : 12 시간 안에 NodeJS를 배우려고하지 마십시오. – Piri

+0

비동기 문제는 피할 수 없습니다. 주변에는 아무런 문제가 없습니다. 그래서 당신은 그들을 받아 들여야합니다. 이것은 비동기 데이터에 의존하는 함수가 값을 반환하기를 기대할 수 없다는 것을 의미합니다. 약속을 지키거나 콜백을 해고해야합니다. 일단 익숙해지면 정말 쉽습니다. 이 대답을 사용하여이를 사용하는 방법을 보여주었습니다. 나는 여러 호출에 대해 test2를 어떻게 사용할 것인지 잘 모르겠다. 그래서 그것에 대해 조언 할 방법이 확실하지 않다. 일반적으로 많은 비동기 호출을 함께 사용해야 할 때 Promise.all()을 사용합니다. –

+0

최소한의 변화만으로도 효과가 있습니다! 고맙습니다 ! – Piri