Restangular错误处理问题

8

I'm having an issue with restangular. This code :

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,正如预期的那样,但是fail日志从未被触发。相反,它进入了成功回调并将"success 404"记录到控制台。

Angular version 1.2.15
Restangular version 1.3.1

欢迎任何帮助!谢谢


你的配置文件中有拦截器吗? - Poyraz Yilmaz
是的我试过了。我尝试不使用拦截器,但是没有改变任何东西。 - sbouba
3个回答

16

根据您的代码示例改编

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

那么应该调用第一个函数,并将其参数设置为myObject。 除非你的myObject具有特定的code或status字段,否则 Restangular 不会添加任何字段。

  • 如果Restangular调用失败:

那么应该调用第二个函数,并将其参数设置为response对象,其中包含状态、头部、数据和配置字段。 在您的示例中,不应存在任何code字段。

如果出现HTTP 404未找到异常,则在我的浏览器JavaScript控制台中会显示: "fail" 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未找到异常的情况下,在我的浏览器javascript控制台中,我获得:资源不可用...

测试使用:

Angular version 1.2.14
Restangular version 1.3.1

1
你忘记在结尾处加上 }]); 以关闭 run 函数! - etiennenoel
@etiennenoel现在已经修复!此外,我尝试使格式更易于阅读。谢谢! - Patrick Refondini
好奇知道如果您删除responseInterceptor并尝试使用成功和错误处理程序进行then调用,是否会遇到相同的问题。在我的情况下,我收到了404状态,但触发了成功回调。然后我删除了我的responseInterceptor,错误回调被触发。添加responseInterceptor会影响Restangular $http处理响应的能力。我也添加了$http,因为它也遇到了同样的问题。 - jusopi
@jusopi,你在谈论ResponseInterceptor,它也存在于Restangular中,但是这里我只描述了ErrorInterceptor的行为,请确保不要混淆它们。有用的官方文档链接:https://github.com/mgonto/restangular#seterrorinterceptor 和 https://github.com/mgonto/restangular#setresponseinterceptor - Patrick Refondini
@patrick-refondini 我在来回滚动时有点卡住了,结果评论到了错误的部分。我发现ErrorInterceptor除了记录日志外并不是很有用,因为如果你返回false,它就永远不会回到promise链中(无论是then还是catch)。其他任何事情都会继续通过promise链进行处理,这些你最好在ResponseInterceptor中处理。 - jusopi
@jusopi ErrorInterceptor 只有在集中管理错误时才有用,例如当您发现自己总是编写相同的行为来处理错误时。这种行为可以是您需要的任何内容,例如向最终用户显示带有消息的弹出窗口或重定向到登录页面,而不仅仅是记录日志。否则,请坚持使用模式:.then(function(myObject){ //success }, function (res) { // failure }); - Patrick Refondini

1
我遇到了与上面原帖中表达的完全相同的症状:HTTP状态OK正常,但HTTP错误却显示成功。
最受欢迎的示例没有起到任何帮助,因为我当时没有setErrorInterceptor,addResponseInterceptor不会触发或出现错误,最后我添加的setErrorInterceptor似乎是在Promise以OK解决之后触发的。
结果问题是我的代码中Promise链中的一个错误。请确保如果您有一个Promise链,每个生成的Promise都返回Promise,否则正在发生的事情将是更早的Promise成功解决并返回,而不是失败的链接部分。
这只是给其他人的提示,以防您遇到此问题。

0
我只能通过在我的配置中向$httpProvider添加拦截器,以及使用RestangularProvider的配置,才使其正常工作。
源码 - 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 );
            }
        };
    } );
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接