如何使用javascript的fetch方法捕获401错误
我需要捕获响应的错误401代码,以便在从令牌端点获取新令牌后重试。我正在使用fetch方法从API获取数据如何使用javascript的fetch方法捕获401错误,javascript,api,Javascript,Api,我需要捕获响应的错误401代码,以便在从令牌端点获取新令牌后重试。我正在使用fetch方法从API获取数据 const request: Request = new Request(url.toString(), { headers: this.defaultRequestHeaders, method: "get", mode: "cors" }); const headers: Headers = new Headers(
const request: Request = new Request(url.toString(), {
headers: this.defaultRequestHeaders,
method: "get",
mode: "cors"
});
const headers: Headers = new Headers({
"Accept": "application/json",
"Content-Type": "application/json"
});
fetch(request)
.then(function(response)
{
///Logic code
})
.catch(function(error)
{
///if status code 401. Need help here
});
您可以在
中检查响应的状态
,然后
:
fetch(request)
.then(function(response) {
if (response.status === 401) {
// do what you need to do here
}
})
.catch(function(error) {});
因为
401
实际上是对服务器请求的有效响应,所以它将执行您的有效响应。只有当出现安全问题,或者服务器没有响应或根本不可用时,才会使用catch
子句。把它想象成和某人说话。即使他们说“我目前不在”或“我没有那个信息”,你的谈话仍然是成功的。只有当保安人员在你中间阻止你与收信人交谈,或者收信人已经死亡时,谈话才会出现实际的失败,你才需要用捕捉
来回应
只需分离出错误处理代码,以便在请求成功但没有预期结果的情况下以及在引发实际错误时处理它:
function catchError( error ){
console.log( error );
}
request.then(response => {
if( !response.ok ){
catchError( response );
} else {
... Act on a successful response here ...
}
}).catch( catchError );
我使用的是
响应。在注释中@Noface建议的ok
,这是有道理的,但是如果您愿意,您可以只检查响应。status==401
。您可以尝试这个
fetch(request)
.then(function(response) {
if (response.status === 401) {
// do what you need to do here
}
})
.catch(function(error) {
console.log('DO WHAT YOU WANT')
});
您可以检查状态,如果不是200(确定),则抛出错误
fetch("some-url")
.then(function(response)
{
if(response.status!==200)
{
throw new Error(response.status)
}
})
.catch(function(error)
{
///if status code 401...
});
来源
当您想
catch (error) {
console.dir(error) // error.response contains your response
}
尝试获取属性error.status如果我从文档中正确理解,则如果服务器返回有效消息(其中
401
是其中之一),则不会抛出错误,因此请尝试。然后(message=>if(response.status==401){…response to the status code…})
。你抢先一步,虽然将消息
替换为响应
,但您也可以检查响应。确定
,确定状态是否在200-299范围内。@VikrantSingh您在说什么?成功的请求位于then
中,返回401
的成功请求仍位于then
子句中<代码>捕获
用于某些错误,但据我在dos中所读到的情况,状态代码并非如此。@VikrantSingh没有人说它将进入捕获块,捕获
块用于实际错误发生时,就像什么都不返回或存在安全问题一样。401状态很简单“是的,我们完成了这个请求,它告诉我们”401“,所以401是一个有效的响应,进入然后,兄弟。如果请求不成功,它就进入内部。然后我可以在fiddler中看到它是401。@VikrantSingh你很不清楚,批评人们,但没有提供任何有用的理由说明原因。返回status 401
的成功请求仍将位于then
处理程序中,因此我看不出问题所在。如果您非常确定,请自己提供答案,或者提供一些高质量的评论,至少可以帮助人们调试问题。如果401执行进入,则可以检查和状态,检查此小提琴是否工作,它只是代码的重构,已经尝试过了。@VikrantSingh它不仅仅是代码的“重构”,你一直在问同样的问题:我如何处理我的catch
中的401响应,答案很简单:它不会自动进入你的catch,因为它是一个有效的响应。所以,请,请,更清楚地说明在这种情况下你试图解决的问题。我想你误解了我的意思,我只想捕捉401错误代码,无论是在.catch block中还是在.then block中。@VikrantSingh已经有两个答案解释了这一点,您可以通过检查成功请求的状态代码来捕获此类错误。如果HTTP响应的状态为401,则不会调用catch
方法的回调函数;相反,将调用then
方法的回调函数,使用response.status==401
。我不完全同意在http请求成功时抛出错误。401甚至不是服务器错误,只是未经授权。最好检查响应代码并将您的逻辑交给IMHO。在许多情况下,200以外的值是可以的,主要是201,但某些重定向可能会在某一天发生(最坏的情况,例如在会议中)
catch (error) {
console.dir(error) // error.response contains your response
}
fetch(url,{
method: 'GET',
headers,
body: JSON.stringify(aData)
}).then(response => {
if(response.ok){
return response.json();
}
return Promise.reject(response);
}).catch(e => {
if(e.status === 401){
// here you are able to do what you need
// refresh token ..., logout the user ...
console.log(e);
}
return Promise.reject(e.json());
});