如果node.js出错则重试请求

时间:2017-09-08 07:48:32

标签: javascript node.js interceptor

我有一个带节点的应用程序,我的应用程序在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)之后?

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

您可以使用 let response = { statusCode: responseCode, headers: { "x-custom-header" : "my custom header value", "Access-Control-Allow-Origin": "*" }, body: JSON.stringify(responseBody) }; console.log("response: " + JSON.stringify(response)) return response; 钩子检测错误,检查是否为 401,然后刷新令牌并重新提交原始请求。

来自文档:

afterResponse

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