2016-03-09 5 views
2

J'ai pu définir mon code de sorte que lorsque vous faites une requête à une fonction api, une fonction oAuthHandler gère automatiquement l'authentification pour vous. Le problème que je rencontre est que je n'arrive pas à trouver un moyen de mettre en cache le jeton sur plusieurs appels, donc je demande seulement un nouveau jeton s'il a déjà expiré.Comment puis-je mettre en cache le jeton oAuth entre les appels d'API dans node.js

J'ai mis des échantillons de tous les fichiers de code pertinents et mon fichier de test dans le GIST suivant. J'ai seulement enlevé les détails de connexion de serveur du fichier. Gist: https://gist.github.com/jgpeak/56e82c58b368429d4aad

Répondre

1

J'ai trouvé ce que j'ai fait de mal avec la mise en cache des jetons. Au lieu d'initier une variable en dehors de l'export du module j'ai dû l'initialiser dans la fonction de la première exportation afin qu'elle se lie à l'instance que je crée pour passer aux autres méthodes api mises à jour oAuthHandler ci-dessous.

(function() { 
'use strict'; 

//Required Modules 
// =============== 
const request = require('./requestHandler'); 
const cache = require('memory-cache'); 

//Hidden Variables 
// =============== 

module.exports = (oAuth) => { 
    var cachedToken = null; 
    return (processor, options, postData) => new Promise(function (resolve, reject) { 

    var errorProcessor = (err) => { 
     //If authorization failure refresh token and try one more time 
     if(err.statusCode && err.statusCode === 401){ 
     return oAuth.getToken() 
      .then((token)=>{ 
      cachedToken = token; 
      return request(token, processor, options, postData); 
      }) 
      .then((response) => resolve(response)) 
      .catch((err) => { 
      reject(err); 
      }); 
     } 
     return reject(err); 
    }; 

    if(cachedToken){ 
     return request(cachedToken, processor, options, postData) 
     .then((response) => resolve(response)) 
     .catch(errorProcessor); 
    } 
    else { 
     return oAuth.getToken() 
     .then((token)=>{ 
      cachedToken = token; 
      return request(token, processor, options, postData); 
     }) 
     .then((response) => resolve(response)) 
     .catch(errorProcessor); 
    } 
    }); 
}; 

}());