1

react.jsでSPAをコーディングしています。私はredux-apiを使用してバックエンド接続を処理しています。メインアクションを実行する前に認証トークンをリフレッシュするための同期アクションを実行する必要があります。この方法で、私がバックエンドにアクションを実行するたびに、トークンが有効であることを確認します。プリフェッチブロック内のredux-api同期アクション

const endpoints = { 
{ 
    url: '/some/url', 
    crud:true, 
    prefetch:[ 
    ({actions, dispatch, getState}, cb) =>{ 
     actions.auth_token.post(JSON.stringify({ 
     token: "my token", 
     refreshToken: "my_refresh_token" 
     }),null, (err, data) =>{ 
      if(err){ 
      // HANDLE ERROR 
      } 
      setToken(data) 
     }) 
    } 
    ] 
} 
} 

const api = reduxApi(endpoints) 

どのようにしてプリフェッチ機能を同期方式で呼び出すことができますか?最初にトークンがリフレッシュされ、次にアクションが実行されますか?私たちは、スタッフ非同期を行うことができます

EDIT が、重要なのは、ここでCBへの最終呼び出し()、一例である

const endpoints = { 
{ 
    url: '/some/url', 
    crud:true, 
    prefetch:[ 
    ({actions, dispatch, getState}, cb) =>{ 
     let mills = new Date().getTime() 
     const { token, generationTime, accessTokenLife, refreshTokenLife, refreshToken } = localStorage 
     // Conditions: exixts token, it is expired, refresh token is not expired 
     if(token && generationTime + accessTokenLife - 500 < mills && generationTime + refreshTokenLife - 500 > mills){ 

     dispatch(actions.token_refresh.get(null, null, (err, data) =>{ 
     if(err){ 
      dispatch(setError(err)) 
     }else{ 
      refreshTokenData(data) 
     } 
     cb() 
     }))  
    }else{ 
    cb() 
    } 
} 
]}} 

const api = reduxApi(endpoints) 

答えて

0

であるあなたは、トークンにあなたがするたびに要求する必要がないかもしれません非同期アクション。実際、私はあなたにしないことをお勧めします。

トークンは、ユーザーを認証してweb storageを使用してキャッシュするときにトークンを要求できます。必要なときに毎回ユーザーのトークンを取得するネットワーク要求を送信する代わりに、ブラウザのキャッシュ記憶域を確認するだけです。ユーザーのトークンが存在する場合、ユーザーは正常に認証されました。それ以外の場合、ユーザーはログインしていないため、ユーザーを認証ページにリダイレクトできます。

これは実際にあなたの問題に対する答えではなく、むしろあなたの問題を解決するための別の方法であり、質問にもっとインラインであなたの質問に答えます。 promise chainingを利用してユーザーのトークンを要求し、その解決後は他の操作を実行する必要があります。

redux-apiに関連する抽象的な方法ではなく、redux-api固有の構成に簡単に適応できるはずです。あなたが作る必要があるでしょう

const actionOne =() => { 
    actions.post(myJson) 
    .then(response => actionTwo(response)) 
    .catch(error => console.log(error)) 
} 

重要な変更は、約束を返すようにactions.auth_token.postを変換することです。次に、その約束の解決に他のアクションを連鎖させることができます。あなたがMDNs documentationの約束をよく知らない人は、かなり良いです。関数をコールバックから約束に変換する方法の詳細については、このスタックオーバーフローanswerが非常に詳細です。

+1

こんにちは!答えをありがとう。 この例では、問題を指摘するためにSSCCEを作成したいと思います。開発環境でトークンを取得し、有効期限が切れる前にリフレッシュします。いずれにせよ、私は解決策を見つけました:私は非同期操作を使用することができ、成功またはエラーの場合は、cb()関数を呼び出さなければなりません。それでおしまい! –

関連する問題