代码之家  ›  专栏  ›  技术社区  ›  Alberto

反应-令牌刷新的执行顺序错误

  •  0
  • Alberto  · 技术社区  · 8 年前

    我对React很陌生,我一直在帮助React解决我们项目中的一个问题。JWT令牌在某些操作之前过期,在执行最初要执行的“final”调用之前,我们需要使用JWT refresh令牌刷新它。

     mainFunction() {
        [...]
        if (!userTokenIsValid) {
           updateUserToken();
        }
        executeWhateverNeedsPermission();
        [...]
     }
    
     function userTokenIsValid() {
       if (!localStorage.userToken) return null;
       return (jwt.decode(localStorage.userToken).expiry > 30);
     }
    
     function getNewUserToken() {
       if (!localStorage.userToken) return null;
        return rp({
            uri: API_URL + "/token/refresh",
            method: 'POST',
            headers: {
                Authorization: localStorage.refreshToken
            },
            json: true
        }).then((data) => {
            if (!data || !data.userToken) {
                localStorage.removeItem('userToken')
            } else {
                localStorage.setItem('userToken', data.token);
            }
        }).catch((error) => {
            console.log("Something went wrong: " + error);
            throw error;
        });
     }
    

    我希望上面的代码按顺序执行,因此检查令牌并在必要时请求一个新的令牌,然后执行对API的请求。

    401/管理/资源 200/api/令牌/刷新

    如前所述,我对这一点还很陌生,我想我应该把代码改成使用promises,但我给出的每一次试用都不起作用(因为我的新手代码,我必须承认)。任何帮助都将不胜感激!

    1 回复  |  直到 8 年前
        1
  •  1
  •   Pedro Brost    8 年前

    我猜你在打电话 getNewUserToken updateUserToken . 用那个密码 executeWhateverNeedsPermission 会在你创造的承诺之前被召唤 rp 已完成。所以你需要打电话 执行whateverneedspermission

    function mainFunction() {
      // [...]
      if (!userTokenIsValid()) {
        updateUserToken().then(() => executeWhateverNeedsPermission());
      } else {
        executeWhateverNeedsPermission();
      }
      // [...]
    }
    

    或者使用async/await稍微改进代码:

    async function mainFunction() {
      // [...]
      if (!userTokenIsValid()) {
        await updateUserToken();
      }
      executeWhateverNeedsPermission();
      // [...]
    }
    
    推荐文章