【问题标题】:Retry request if error with node.js如果 node.js 出错,重试请求
【发布时间】:2020-12-31 11:54:57
【问题描述】:

我有一个带有节点的应用程序,并且我的应用程序在 API 上使用 JWT 进行了身份验证(作为客户端)。

出现 401 错误时如何刷新我的令牌?

我的项目不使用 Express

我的服务:

const request = require('request');

let config = require('../../configuration');

module.exports = {
    get_movies: function () {
        return new Promise((resolve, reject) => {
            request({
                method: 'GET',
                uri   : 'http://myapi/v1/movies',
                auth  : {
                    'bearer': config.token
                },
                json  : true
            }, function (error, response, body) {
                if (!error && response.statusCode === 200) {
                    resolve(body);
                } else {
                    reject(response);
                }
            })
        });
    },
    ...
    refreshToken: function () {
        return new Promise((resolve, reject) => {
            request({
                method: 'GET',
                uri   : 'http://myapi/v1/token-refresh',
                auth  : {
                    'bearer': config.token
                },
                json  : true
            }, function (error, response, body) {
                if (!error && response.statusCode === 200) {
                    resolve(body);
                } else {
                    reject(response);
                }
            })
        });
};

我想知道是否可以在我的 get_movies 函数上拦截我的(错误 401)请求,例如,调用我的刷新令牌函数并在重试我之前的函数 (get_movies) 之后?

【问题讨论】:

    标签: javascript node.js interceptor


    【解决方案1】:

    一种简单的方法是在您的get_movies 承诺之后放置一个错误处理程序来处理案例并重试。大致如下:

    get_retry: function () {
        return get_movies().catch((rejection) => {
            if (rejection.statusCode === 401)
                return refreshToken().then((x) => get_retry())
        })
    }
    

    如果您的refreshToken() 有可能无法修复HTTP 401,请注意无限循环的可能性。

    【讨论】:

      【解决方案2】:

      为此我一直在使用got,并且对此非常满意。

      您可以使用afterResponse钩子检测错误,检查是否为401,然后刷新令牌并重新提交原始请求。

      来自文档:

      const got = require('got');
      
      const instance = got.extend({
          hooks: {
              afterResponse: [
                  (response, retryWithMergedOptions) => {
                      if (response.statusCode === 401) { // Unauthorized
                          const updatedOptions = {
                              headers: {
                                  token: getNewToken() // Refresh the access token
                              }
                          };
      
                          // Save for further requests
                          instance.defaults.options = got.mergeOptions(instance.defaults.options, updatedOptions);
      
                          // Make a new retry
                          return retryWithMergedOptions(updatedOptions);
                      }
      
                      // No changes otherwise
                      return response;
                  }
              ],
              beforeRetry: [
                  (options, error, retryCount) => {
                      // This will be called on `retryWithMergedOptions(...)`
                  }
              ]
          },
          mutableDefaults: true
      });
      

      到目前为止,它对我来说效果很好:-)

      【讨论】:

        猜你喜欢
        • 2021-08-12
        • 1970-01-01
        • 2021-01-06
        • 1970-01-01
        • 2016-04-27
        • 1970-01-01
        • 2020-05-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多