如何显示从 HttpResponseErrInterceptor 到特定控制器的响应消息
How to display response message from a HttpResponseErrInterceptor to a specific controller
我在 createController.js 上有一个 post 请求,但我的 onError 承诺不起作用。
ManageCaseOutlineServices.getInsert({
table: 'manageCaseOutline'}, self.caseOutlineHeader).then(function (response) {
self.isLoading = false;
self.successMessage = "Record Successfully Saved";
self.openAlertModal('success');
}, function (error) {
self.isLoading = false;
console.log(error.data); //this line code is not displaying.
});
当我调试我的代码时,我看到我的 maincontroller.js 中配置了一个 HttpResponseErrInterceptor,所以我认为这就是 onError 不起作用的原因。
module.factory('HttpResponseErrInterceptor',
function($q, $location, $timeout, $rootScope, apiConfig, ErrorLogger) {
return {
responseError : function(response) {
var defer = $q.defer();
switch (response.status) {
case 403:
ErrorLogger.logError(response);
break;
case 404:
ErrorLogger.logError(response);
break;
case 422:
console.log(response.data);
break;
case 504:
ErrorLogger.logError(response);
break;
case 502:
ErrorLogger.logError(response);
break;
case 500:
ErrorLogger.logError(response);
break;
}
$rootScope.isLoading = false;
return defer.promise;
}
};
});
module.config([ '$httpProvider', function($httpProvider) {
$httpProvider.interceptors.push('BearerAuthInterceptor');
$httpProvider.interceptors.push('HttpResponseErrInterceptor');
} ]);
我在上面的 switch 语句中添加了一个错误代码 422,这是我的响应中的错误代码。我尝试添加控制台日志,当我在其他控制器上收到错误 422 时,它会被记录下来。
现在我的问题是如何访问特定控制器的错误响应,以便能够在我的 HTML 视图中显示它?
module.controller('myctrl',function($scope,ErrorLogger){
ErrorLogger.responseError (response);
}
您可以直接将此拦截器注入到您的控制器中,并将状态代码设置为 422 的响应传递给响应,这将依次进入 switch case 并填充您的日志
您可以使用来自 angularJs 的 $broadcast 获取特定的错误代码,并且借助 $on 的帮助,您可以在应用程序的任何控制器中捕获事件。
拦截器
module.factory('HttpResponseErrInterceptor',
function($q, $location, $timeout, $rootScope, apiConfig, ErrorLogger) {
return {
responseError : function(response) {
var defer = $q.defer();
switch (response.status) {
case 403:
$rootScope.$broadcast('responseError', response);
break;
...
您应用的任何控制器
$rootScope.$on('responseError', function (event, response) {
ErrorLogger.logError(response);
});
错误拦截器需要重新抛出错误:
module.factory('HttpResponseErrInterceptor',
function($q, $location, $timeout, $rootScope, apiConfig, ErrorLogger) {
return {
responseError : function(response) {
̶v̶a̶r̶ ̶d̶e̶f̶e̶r̶ ̶=̶ ̶$̶q̶.̶d̶e̶f̶e̶r̶(̶)̶;̶
switch (response.status) {
case 403:
ErrorLogger.logError(response);
break;
case 404:
ErrorLogger.logError(response);
break;
case 422:
console.log(response.data);
break;
case 504:
ErrorLogger.logError(response);
break;
case 502:
ErrorLogger.logError(response);
break;
case 500:
ErrorLogger.logError(response);
break;
}
$rootScope.isLoading = false;
̶r̶e̶t̶u̶r̶n̶ ̶d̶e̶f̶e̶r̶.̶p̶r̶o̶m̶i̶s̶e̶;̶
return $q.reject(response);
}
};
}
)
我在 createController.js 上有一个 post 请求,但我的 onError 承诺不起作用。
ManageCaseOutlineServices.getInsert({
table: 'manageCaseOutline'}, self.caseOutlineHeader).then(function (response) {
self.isLoading = false;
self.successMessage = "Record Successfully Saved";
self.openAlertModal('success');
}, function (error) {
self.isLoading = false;
console.log(error.data); //this line code is not displaying.
});
当我调试我的代码时,我看到我的 maincontroller.js 中配置了一个 HttpResponseErrInterceptor,所以我认为这就是 onError 不起作用的原因。
module.factory('HttpResponseErrInterceptor',
function($q, $location, $timeout, $rootScope, apiConfig, ErrorLogger) {
return {
responseError : function(response) {
var defer = $q.defer();
switch (response.status) {
case 403:
ErrorLogger.logError(response);
break;
case 404:
ErrorLogger.logError(response);
break;
case 422:
console.log(response.data);
break;
case 504:
ErrorLogger.logError(response);
break;
case 502:
ErrorLogger.logError(response);
break;
case 500:
ErrorLogger.logError(response);
break;
}
$rootScope.isLoading = false;
return defer.promise;
}
};
});
module.config([ '$httpProvider', function($httpProvider) {
$httpProvider.interceptors.push('BearerAuthInterceptor');
$httpProvider.interceptors.push('HttpResponseErrInterceptor');
} ]);
我在上面的 switch 语句中添加了一个错误代码 422,这是我的响应中的错误代码。我尝试添加控制台日志,当我在其他控制器上收到错误 422 时,它会被记录下来。
现在我的问题是如何访问特定控制器的错误响应,以便能够在我的 HTML 视图中显示它?
module.controller('myctrl',function($scope,ErrorLogger){
ErrorLogger.responseError (response);
}
您可以直接将此拦截器注入到您的控制器中,并将状态代码设置为 422 的响应传递给响应,这将依次进入 switch case 并填充您的日志
您可以使用来自 angularJs 的 $broadcast 获取特定的错误代码,并且借助 $on 的帮助,您可以在应用程序的任何控制器中捕获事件。
拦截器
module.factory('HttpResponseErrInterceptor',
function($q, $location, $timeout, $rootScope, apiConfig, ErrorLogger) {
return {
responseError : function(response) {
var defer = $q.defer();
switch (response.status) {
case 403:
$rootScope.$broadcast('responseError', response);
break;
...
您应用的任何控制器
$rootScope.$on('responseError', function (event, response) {
ErrorLogger.logError(response);
});
错误拦截器需要重新抛出错误:
module.factory('HttpResponseErrInterceptor',
function($q, $location, $timeout, $rootScope, apiConfig, ErrorLogger) {
return {
responseError : function(response) {
̶v̶a̶r̶ ̶d̶e̶f̶e̶r̶ ̶=̶ ̶$̶q̶.̶d̶e̶f̶e̶r̶(̶)̶;̶
switch (response.status) {
case 403:
ErrorLogger.logError(response);
break;
case 404:
ErrorLogger.logError(response);
break;
case 422:
console.log(response.data);
break;
case 504:
ErrorLogger.logError(response);
break;
case 502:
ErrorLogger.logError(response);
break;
case 500:
ErrorLogger.logError(response);
break;
}
$rootScope.isLoading = false;
̶r̶e̶t̶u̶r̶n̶ ̶d̶e̶f̶e̶r̶.̶p̶r̶o̶m̶i̶s̶e̶;̶
return $q.reject(response);
}
};
}
)