我遇到了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
欢迎任何帮助!感谢
答案 0 :(得分:15)
改编自您的代码示例
Restangular.one("undefined_ressource").get().then(
function(myObject){
console.log("success obtained myObject");
},
function (res) {
console.log("fail", res.status);
}
);
然后应该调用第一个函数 它的参数应该是 myObject 。 除非您的 myObject 具有特定的代码或状态字段,否则不会被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 );
}
};
} );
}