2016-11-12 90 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

promisify只''JWT.verify'與'新的承諾',在一個單獨的功能。然後調用它並使用'then'回調函數 – Bergi

回答

0

有了這樣的問題,通常最好將Promise的創建與高階應用程序邏輯分開。這是通過在最低可能級別進行promised - 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); 
};