2016-11-12 1 views
0
function Auth() { 
    this.accessTokenError = false; 

} 
Auth.prototype.validateToken = function (accessToken, refreshToken) { 
    var token; 
    var self = this; 
    return new Promise(function (resolve, reject) { 
     AuthCron.secret() 
      .then(function (secret) { 

       if (self.accessTokenError) { 
        token = refreshToken; 
        secret = secret.substr(0, secret.length/2); 
       } 
       else 
        token = accessToken; 
       JWT.verify(token, secret, function (error, decoded) { 
        console.log(error, decoded); 
        if (error) { 
         if (!self.accessTokenError) { 
          self.accessTokenError = true; 
          // I don't know how to handle this 
          self.validateToken(accessToken, refreshToken) 
         } 
         else { 
          self.accessTokenError = false; 
          reject(error); 
         } 
        } 
        else 
         resolve(decoded.user); 
       }); 

      }) 
      .catch(function (err) { 

       reject(err) 
      }); 
    }) 
}; 

재귀 적 약속을 처리하는 방법에 대해 혼동스러워합니다. 여기서의 문제는 결코 해결하거나 거부하지 않는 첫 번째 약속입니다. 이 상황을 처리하는 가장 좋은 방법은 무엇입니까? 이 함수는 액세스 토큰이 만료되었거나 유효하지 않은 경우 새로 고침 토큰이 유효한지, 토큰 갱신이 유효하지 않으면 약속이 거부되어야하는 경우 두 개의 토큰을받습니다.재귀 약속을 처리하는 방법

+2

은 피 ['Promise' 생성자 안티 패턴 (http://stackoverflow.com/q/23803743/1048572)! – Bergi

+0

코드 위의 리팩토링 자 – Rayees

+1

은'JWT.verify'와'new Promise' 만 별도로 약속합니다. 그런 다음 그것을 호출하고 다른 모든 호출에 'then' 호출을 사용합니다. – Bergi

답변

0

이와 같은 문제점으로 인해 일반적으로 상위 응용 프로그램 논리와 약속 작성을 분리하는 것이 가장 좋습니다. 이 경우 가능한 한 가장 낮은 수준 인 JWT.verify()으로 약속함으로써 수행됩니다. 오직 재귀 수준의 최대있을 것 같이 이제

JWT.verifyAsync = function(token, secret) { 
    return new Promise((resolve, reject) => { 
     JWT.verify(token, secret, (error, decoded) => { 
      error ? reject(error) : resolve(decoded); 
     }); 
    }); 
}; 

, 당신은 여전히 ​​재귀 적 시도를 수행 할 Auth.prototype.validateToken() 방법을 쓸 수 있지만 수는 모두 시도와 하드 코드보다 훨씬 간단합니다 (의사 코드) first_try().catch(() => second_try()). 보너스로, 그 어색한 .accessTokenError 부울의 필요성이 사라집니다.

은 여기 전체에 있습니다

Auth.prototype.validateToken = function(accessToken, refreshToken) { 
    return AuthCron.secret() 
    .then(secret => { 
     return JWT.verifyAsync(accessToken, secret) // first try 
     .catch(() => JWT.verifyAsync(refreshToken, secret.substr(0, secret.length/2))); // second try 
    }) 
    .then(decoded => decoded.user); 
}; 
관련 문제