[英]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
請注意無限循環的可能性。
您可以使用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.