Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用javascript的fetch方法捕获401错误_Javascript_Api - Fatal编程技术网

如何使用javascript的fetch方法捕获401错误

如何使用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(

我需要捕获响应的错误401代码,以便在从令牌端点获取新令牌后重试。我正在使用fetch方法从API获取数据

   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());
        });