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

时间:2018-04-18 14:32:48

标签: javascript api

我需要捕获错误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
        });

7 个答案:

答案 0 :(得分:4)

您可以检查状态,如果不是200(确定),则会抛出错误

 fetch("some-url")
    .then(function(response)
     {
      if(response.status!==200)
       {
          throw new Error(response.status)
       }
     })
    .catch(function(error)
    {
      ///if status code 401...
    });

答案 1 :(得分:1)

因为401实际上是对服务器请求的有效响应,所以无论如何都会执行您的有效响应。仅当出现安全问题,或者服务器无响应或根本不可用时,才会使用catch子句。试想和别人说话就好像想象的那样。即使他们说“我目前无法使用”或“我没有这些信息”,您的对话仍然成功。只有当一个安全人员介入您之间并阻止您与收件人交谈,或者如果收件人时,会话中是否会出现实际的失败,您是否需要使用catch

只需将您的错误处理代码分开,这样您就可以在请求成功但不具备所需结果的情况下处理它,以及就像抛出实际错误时一样:< / p>

function catchError( error ){

    console.log( error );

}

request.then(response => {

    if( !response.ok ){

        catchError( response );

    } else {

        ... Act on a successful response here ...

    }

}).catch( catchError );

我在评论中使用@Noface建议的response.ok,因为它有意义,但如果您愿意,您只能检查response.status === 401

答案 2 :(得分:0)

您可以在status

中查看回复的then
fetch(request)
  .then(function(response) {
    if (response.status === 401) {
      // do what you need to do here
    }
  })
  .catch(function(error) {});

答案 3 :(得分:0)

您可以尝试

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

答案 4 :(得分:0)

(function () {
var originalFetch = fetch;
fetch = function() {
    return originalFetch.apply(this, arguments).then(function(data) {
        someFunctionToDoSomething();
        return data;
    });
};})();

来源 Can one use the Fetch API as a Request Interceptor?

答案 5 :(得分:0)

当你想...

catch (error) {
  console.dir(error) // error.response contains your response
}

答案 6 :(得分:0)

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