Restangular错误处理问题

时间:2014-03-11 16:30:49

标签: error-handling restangular

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

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

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

Angular version 1.2.15
Restangular version 1.3.1

欢迎任何帮助!感谢

3 个答案:

答案 0 :(得分:15)

改编自您的代码示例

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

然后应该调用第一个函数 它的参数应该是 myObject 。 除非您的 myObject 具有特定的代码或状态字段,否则不会被Restangular添加。

  • 如果Restangular调用失败:

然后应该调用第二个函数,它的参数是一个带有状态,标题,数据,配置字段的响应对象。 不应该有任何代码字段,如您的示例所示。

如果出现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
        }
    );
}]);

如果您的角度应用程序 myAngularApp 上设置了错误拦截器,如上例所示,则失败应该无法再进入您的自定义调用然后第二个函数,但会被处理通过errorInterceptor设置函数。

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

经过测试:

Angular version 1.2.14
Restangular version 1.3.1

答案 1 :(得分:1)

我得到了与上面原帖中表达的完全相同的症状:HTTP Status OK没问题,但是HTTP错误会成功。

评价最高的例子根本没有帮助,因为我没有setErrorInterceptor(当时),addResponseInterceptor没有触发或错误,最后我添加的setErrorInterceptor似乎是在承诺解析为

之后触发

事实证明问题是我的代码的promise链中的错误。确保你是否有一个承诺链,生成的每个承诺都会返回承诺,否则正在发生的事情就是先前的承诺是成功解决并返回,而不是失败的链接部分。

如果遇到这种情况,请给别人一个提示。

答案 2 :(得分:0)

除了使用我的配置$httpProvider

之外,我只能通过在我的配置中为RestangularProvider添加拦截器来实现此功能

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