1

Ich bin ein SPA in react.js codieren und ich verwende Redux-API Backend-Verbindung zu behandeln. Ich möchte eine Synchronisierungsaktion ausführen, um das Authentifizierungs-Token zu aktualisieren, bevor die Hauptaktion ausgeführt wird. Auf diese Weise werde ich jedes Mal, wenn ich eine Aktion für das Backend mache, sicher sein, dass das Token gültig ist.redux-api Synchronisierung Aktion in einem Prefetch-Block

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) 

Wie kann ich die Vorabruffunktion auf synchrone Weise aufrufen? Also zuerst das Token aktualisiert und dann die Aktion?

EDIT Wir haben das Zeug async tun können, die wichtig ist der letzte Aufruf an cb(), hier ist das Beispiel

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) 

Antwort

0

Sie müssen möglicherweise nicht das Token anzufordern jedes Mal, wenn Sie ein tun asynchrone Aktion In der Tat würde ich dich ermutigen, es nicht zu tun.

Sie können das Token anfordern, wenn Sie den Benutzer authentifizieren und zwischen web storage zwischenspeichern. Anstatt nun eine Netzwerkanforderung zu senden, um das Benutzer-Token bei Bedarf wieder abzurufen, überprüfen Sie einfach den zwischengespeicherten Browserspeicher. Wenn das Token für den Benutzer existiert, hat sich der Benutzer erfolgreich authentifiziert. Andernfalls ist der Benutzer nicht angemeldet und Sie können den Benutzer auf die Authentifizierungsseite umleiten.

Da dies nicht wirklich eine Antwort auf Ihr Problem ist, sondern eine andere Art und Weise, Ihr Problem zu lösen, werde ich auch Ihre Frage auf eine Weise beantworten, die mehr mit der Frage in Zusammenhang steht. Sie sollten in der Lage sein, promise chaining zu verwenden, um das Token des Benutzers anzufordern, und dann, wenn dies verrechnet ist, führen Sie eine andere Aktion aus.

Ich werde auf eine abstrakte Weise erklären, die nicht explizit mit Redux-Api verwandt ist, dass Sie in der Lage sein sollten, sich an Redux-Api-spezifische Konstrukte einfach genug anzupassen.

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

Eine wichtige Änderung, die Sie würden müssen, ist machen actions.auth_token.post zu konvertieren ein Versprechen zurückzukehren. Dann können Sie andere Aktionen an die Lösung dieses Versprechens ketten. Wenn Sie nicht vertraut sind mit Versprechungen MDNs documentation ist ziemlich gut. Für weitere Informationen zum Konvertieren einer Funktion von Callbacks zu Versprechen ist dieser Stack Overflow answer ziemlich detailliert.

+1

Hallo! Danke für die Antwort. Mit diesem Beispiel wollte ich ein SSCCE machen, um auf das Problem hinzuweisen, in der Entwicklungsumgebung erhalte ich das Token und aktualisiere es, bevor es abläuft. In jedem Fall fand ich die Lösung: Ich kann eine asynchrone Operation verwenden und bei Erfolg oder Fehler muss ich die cb() Funktion aufrufen. Das ist es! –