【问题标题】:Restangular error handling issueRestangular错误处理问题
【发布时间】:2016-02-23 06:11:06
【问题描述】:

我遇到了restangular的问题。这段代码:

Restangular.one("undefined_ressource").get().then(
    function(res){
        console.log("success", res.code);
    },
    function (res) {
        console.log("fail", res.code);
   }
);

尝试获取不退出的 url http://api.local.com/undefined_ressource。我的服务器按预期返回 404,但从未触发失败日志。 Intead 它进入成功回调并将"success 404" 记录到控制台。

Angular version 1.2.15
Restangular version 1.3.1

欢迎任何帮助!谢谢

【问题讨论】:

  • 你的配置中有拦截器吗?
  • 是的,我愿意。我试过没有拦截器,但它没有改变任何东西。

标签: error-handling restangular


【解决方案1】:

改编自您的代码示例

Restangular.one("undefined_ressource").get().then(
    function(myObject){
        console.log("success obtained myObject");
    },
    function (res) {
        console.log("fail", res.status);
   }
);
  • 如果 Restangular 调用成功:

then 应该调用第一个函数 它的参数应该是myObject。 除非您的 myObject 具有特定的 code 或 status 字段,否则 Restangular 不会添加任何字段。

  • 如果 Restangular 调用失败:

then 第二个函数应该被调用,它的参数是一个 response 对象,包含状态、标题、数据、配置字段。 如您的示例所示,不应有任何 code 字段可用。

如果出现 HTTP 404 Not Found 异常,在我的导航器 javascript 控制台中,我确实获得了: “失败”404

带有错误拦截器

myAngularApp.run(['Restangular', '$window', function(Restangular, $window){
    Restangular.setErrorInterceptor(
        function(response) {
            if (response.status == 401) {
                console.log("Login required... ");
                $window.location.href='/login';
            } else if (response.status == 404) {
                console.log("Resource not available...");
            } else {
                console.log("Response received with HTTP error code: " + response.status );
            }
            return false; // stop the promise chain
        }
    );
}]);

如果在您的 Angular 应用程序 myAngularApp 上设置了错误拦截器,如上例所示,故障不应再到达您的自定义调用 then 第二个函数,而是被处理由errorInterceptor设置函数。

如果出现 HTTP 404 Not Found 异常,在我的导航器 javascript 控制台中,我确实获得:资源不可用...

测试:

Angular version 1.2.14
Restangular version 1.3.1

【讨论】:

  • 你少了一个 }]);最后关闭运行功能!
  • @etiennenoel 现已修复!此外,我尝试使格式更易于阅读。谢谢!
  • 很想知道您是否删除了您的 responseInterceptor 并尝试使用成功和错误处理程序调用 then 如果您遇到同样的事情。就我而言,我得到了 404 状态,但触发了成功回调。然后我删除了我的 responseInterceptor 并触发了错误回调。添加一个responseInterceptor 会破坏Restangular $http 正常处理响应的能力。我在其中添加了 $http 并且遇到了同样的问题。
  • @jusopi 你说的是ResponseInterceptor,它也存在于Restangular,但这里我只描述了ErrorInterceptor 的行为,请确保不要混淆它们。有用的官方文档:github.com/mgonto/restangular#seterrorinterceptorgithub.com/mgonto/restangular#setresponseinterceptor
  • @patrick-refondini 我在来回滚动时有点卡住了,因为我评论了错误的部分。我发现除了登录之外,ErrorInterceptor 并不是很有用,如果您返回 false,它永远不会返回到 promise 链(无论是 then 还是 catch)。其他任何事情都通过承诺链进行,您不妨在 ResponseInterceptor 中处理。
【解决方案2】:

我得到了与上面原始帖子中表达的完全相同的症状:HTTP 状态正常,但是 HTTP 错误抛出成功。

评分最高的示例根本没有帮助,因为我没有 setErrorInterceptor(当时),addResponseInterceptor 没有触发或错误,最后我添加的 setErrorInterceptor 似乎触发了 after 承诺解决了。

原来问题出在我的代码的承诺链中。确保如果你有一个承诺链,每个生成的承诺都会返回承诺,否则发生的事情将是更早的承诺正在成功解决并被返回,而不是失败的链接部分。

只是给其他人的提示,以防您遇到这种情况。

【讨论】:

    【解决方案3】:

    除了将我的配置用于RestangularProvider之外,我只能通过在我的配置中向$httpProvider添加一个拦截器来实现此功能

    src - https://docs.angularjs.org/api/ng/service/$http#interceptors

    // HttpConfig.js
    function( $httpProvider )
    {
        $httpProvider.interceptors.push( function( $q, $rootScope )
        {
            return {
                'request': function( config )
                {
                    return config;
                },
    
                'requestError': function( rejection )
                {
                    return rejection;
                },
    
                'response':     function( response )
                {
                    return response;
                },
    
                //THIS is what makes it work for me
                'responseError': function( rejection )
                {
                    return $q.reject( rejection );
                }
            };
        } );
    }
    

    【讨论】:

      猜你喜欢
      • 2014-10-23
      • 2014-07-31
      • 1970-01-01
      • 2016-02-26
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      相关资源
      最近更新 更多