如何显示从 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);
            }
        };
    }
)