使用拦截器处理 200 HTTP 响应的错误
Handling errors on 200 HTTP response using interceptors
我有与外部集成的服务 API。这个API不一致,不太可能改变。
在API里面有2种报错方式,一种是HTTP 500码响应,另一种是正常的200 HTTP响应,但是JSON中的status
设置为"error"。
处理 500 错误工作正常,我刚刚使用 responseError
方法创建了拦截器(ngResource 拦截器,而不是 $http 拦截器),当有来自 [=39 的任何 500 响应时,它将向用户显示错误消息=]:
.factory('ApiErrorHandling', ['ngDialog', function(ngDialog) {
return {
responseError: function(response) {
console.log(response);
var error_dialog = ngDialog.open({
template: '/api/error.html',
className: 'error',
preCloseCallback: function() {
if (response.data.status == 'fatal') {
window.location.href = '/';
} else if (response.data.status == 'error') {
var dialogs = ngDialog.getOpenDialogs();
for (var i in dialogs) {
var dialog = dialogs[i];
if (dialog != error_dialog.id) {
ngDialog.close(dialog);
}
}
}
},
data: {
code: response.data.code,
status: response.data.status,
message: response.data.message,
httpCode: response.status,
}
});
},
}
}])
.factory('ApiMethod', ['$resource', 'ApiErrorHandling', function($resource, ApiErrorHandling) {
return $resource('/api/method/', {}, {
query: {method:'POST', interceptor: ApiErrorHandling},
});
}])
但我在使用 status
处理错误响应时遇到问题。我不希望在发生错误时调用正常的成功回调(从资源实例传递到方法中),我想要一个全局错误处理程序,但到目前为止我没有尝试过。每次响应都传递到回调中。到目前为止我已经尝试过:
- 从拦截器
response
方法中返回 $q.reject
- 更改状态代码以响应拦截器
response
方法中的 500
- 从拦截器
response
方法中更改或删除 response.resource
理想的解决方案是不调用普通回调,而是调用拦截器中的 responseError
方法。
But I have problem with handling error responses with status. I don't want normal success callback (passed into method from resource instance) to be called when error occurs, I want one global error handler, but nothing I've tried so far worked. Each time response is passed into callback. I've tried so far:
returning $q.reject in response method from interceptor
要拒绝您不喜欢的回复,请使用 throw
:
function inteceptor(httpPromise) {
var newPromise = (httpPromise
.then(function(response) {
if (dontLike) {
throw response;
} else {
return response;
},
function (eResponse) {
if (iLike) {
return eResponse;
} else {
throw eResponse;
};
})
);
return newPromise;
};
从你的拦截器链接
var chainedPromise = (interceptor(httpPromise)
.then (function (response) {
//render data
return response;
}).catch (function (error) {
console.log(error);
throw error;
})
);
我找到了解决方案。我认为是 ngResource 模块中的一些错误。
像这样注册回调时:
ApiMethod.query({'get_parameter': 1}, {'post_json': 2}, function(result) {
something...
});
防止调用回调的唯一解决方案是从 ngResource 拦截器中抛出错误。但是当回调在 promise 中注册时:
ApiMethod.query({'get_parameter': 1}, {'post_json': 2}).$promise.then(function(result) {
something...
});
只需从拦截器返回 $q.reject
即可阻止调用回调。
重写所有回调注册解决了这个问题。
我有与外部集成的服务 API。这个API不一致,不太可能改变。
在API里面有2种报错方式,一种是HTTP 500码响应,另一种是正常的200 HTTP响应,但是JSON中的status
设置为"error"。
处理 500 错误工作正常,我刚刚使用 responseError
方法创建了拦截器(ngResource 拦截器,而不是 $http 拦截器),当有来自 [=39 的任何 500 响应时,它将向用户显示错误消息=]:
.factory('ApiErrorHandling', ['ngDialog', function(ngDialog) {
return {
responseError: function(response) {
console.log(response);
var error_dialog = ngDialog.open({
template: '/api/error.html',
className: 'error',
preCloseCallback: function() {
if (response.data.status == 'fatal') {
window.location.href = '/';
} else if (response.data.status == 'error') {
var dialogs = ngDialog.getOpenDialogs();
for (var i in dialogs) {
var dialog = dialogs[i];
if (dialog != error_dialog.id) {
ngDialog.close(dialog);
}
}
}
},
data: {
code: response.data.code,
status: response.data.status,
message: response.data.message,
httpCode: response.status,
}
});
},
}
}])
.factory('ApiMethod', ['$resource', 'ApiErrorHandling', function($resource, ApiErrorHandling) {
return $resource('/api/method/', {}, {
query: {method:'POST', interceptor: ApiErrorHandling},
});
}])
但我在使用 status
处理错误响应时遇到问题。我不希望在发生错误时调用正常的成功回调(从资源实例传递到方法中),我想要一个全局错误处理程序,但到目前为止我没有尝试过。每次响应都传递到回调中。到目前为止我已经尝试过:
- 从拦截器
response
方法中返回 $q.reject - 更改状态代码以响应拦截器
response
方法中的 500 - 从拦截器
response
方法中更改或删除 response.resource
理想的解决方案是不调用普通回调,而是调用拦截器中的 responseError
方法。
But I have problem with handling error responses with status. I don't want normal success callback (passed into method from resource instance) to be called when error occurs, I want one global error handler, but nothing I've tried so far worked. Each time response is passed into callback. I've tried so far:
returning $q.reject in response method from interceptor
要拒绝您不喜欢的回复,请使用 throw
:
function inteceptor(httpPromise) {
var newPromise = (httpPromise
.then(function(response) {
if (dontLike) {
throw response;
} else {
return response;
},
function (eResponse) {
if (iLike) {
return eResponse;
} else {
throw eResponse;
};
})
);
return newPromise;
};
从你的拦截器链接
var chainedPromise = (interceptor(httpPromise)
.then (function (response) {
//render data
return response;
}).catch (function (error) {
console.log(error);
throw error;
})
);
我找到了解决方案。我认为是 ngResource 模块中的一些错误。
像这样注册回调时:
ApiMethod.query({'get_parameter': 1}, {'post_json': 2}, function(result) {
something...
});
防止调用回调的唯一解决方案是从 ngResource 拦截器中抛出错误。但是当回调在 promise 中注册时:
ApiMethod.query({'get_parameter': 1}, {'post_json': 2}).$promise.then(function(result) {
something...
});
只需从拦截器返回 $q.reject
即可阻止调用回调。
重写所有回调注册解决了这个问题。