如何在node.js中的API调用之间缓存oAuth令牌

时间:2016-03-09 00:45:54

标签: node.js node-rest-client

我已经能够设置我的代码,以便当您向api函数发出请求时,oAuthHandler函数会自动为您处理身份验证。我遇到的问题是我无法找到一种方法来在多个调用之间缓存令牌,所以我只是在它已经过期时才请求新令牌。

我已将所有相关代码文件和我的测试文件的样本放在以下GIST中。我只从文件中删除了服务器连接详细信息。 要点:https://gist.github.com/jgpeak/56e82c58b368429d4aad

1 个答案:

答案 0 :(得分:1)

我发现我在令牌缓存方面做错了什么。我不需要在模块导出之外启动变量,而是需要在第一个导出的函数内启动它,以便它绑定到我创建的实例,以传递给下面更新的oAuthHandler的其他api方法。

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

}());