簡體   English   中英

如果 node.js 出錯,請重試請求

[英]Retry request if error with node.js

我有一個帶有節點的應用程序,我的應用程序通過 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)?

一種簡單的方法是在get_movies承諾處理案例get_movies試之后放置一個錯誤處理程序。 沿着以下路線:

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

如果您的refreshToken()有可能無法修復HTTP 401請注意無限循環的可能性。

我一直為此使用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
});

到目前為止,它對我來說很好用 :-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM