Как я могу кэшировать токен oAuth через вызовы API в node.js

Я смог настроить свой код таким образом, чтобы при отправке запроса к функции API функция oAuthHandler автоматически выполняла аутентификацию для вас. Однако у меня проблема в том, что я не могу найти способ кэширования токена между несколькими вызовами, поэтому я запрашиваю новый токен, только если срок его действия уже истек.

Я поместил образцы всех соответствующих кодовых файлов и моего тестового файла в следующую GIST. Я удалил только детали подключения к серверу из файла. Суть: https://gist.github.com/jgpeak/56e82c58b368429d4aad

1 ответ

Решение

Я нашел, что я сделал не так с кэшированием токена. Вместо того, чтобы инициировать переменную вне экспорта модуля, мне нужно было инициировать ее в функции первого экспорта, чтобы она связывалась с экземпляром, который я создаю, для передачи другим методам API, обновленным oAuthHandler ниже.

(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);
    }
  });
};

}());
Другие вопросы по тегам