2015-06-10 2 views
1

В настоящее время у меня есть это:Angular - Как правильно обрабатывать HTTP-ошибку с сервера?

$http({ 
    method: 'POST', 
    url: 'http://api-endpoint/somescript/', 
    data: formData, 
    headers: { 
     'Content-Type': 'application/x-www-form-urlencoded' 
    } 
}) 
.then(function (response) { 
    console.log(response); 
}); 

Если скрипт на другом конце работает нормально, then вызывается. Однако предположим, что сценарий на сервере имеет некоторую ошибку, которая не была правильно поймана. Если я делаю ошибку, бросая в какой-то мусорный вызова, как asdfasdf(), функция then не называется, а вместо этого я получаю это в консоли браузера:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading 
the remote resource at http://api-endpoint/somescript/. (Reason: CORS 
header 'Access-Control-Allow-Origin' missing). 

Как поймать это в угловом коде так Я могу справиться с этим по-дружески?

EDIT: Это не дубликат, так как он специфичен для углового.

ответ

1

Метод $q.then() принимает три параметра функции, первый из которых обработчик для успешных обратных вызовов , второе - для ошибок, а третье - для уведомления. $http использует $q за кулисами, поэтому этот thenable должен вести себя так, как предлагает документация.

Для обработки ошибок в коде выше, просто бросить в качестве дополнительной функции для обработки ошибок, как, например:

.then(function (response) { 
    console.log(response); 
}, function(response) { 
    console.log(response); 
}); 

Не стесняйтесь просматривать $q документации, в частности Promise API, для получения дополнительной информации.

+0

Спасибо! Было бы неправильно добавить весь этот код перехватчика для чего-то такого простого. – CaptSaltyJack

+0

@CaptSaltyJack Нет проблем, рад, что это помогло, и я надеюсь, что это тоже поможет другим :) – Matt

+0

@CaptSaltyJack - Ну, я не согласен с тобой. Это будет выглядеть более неправильно, если у вас есть 100 API-интерфейсов, и вы должны написать вторую функцию каждый раз. Таким образом, общая обработка - это лучшее, что мы можем сделать для нашего кода. Хотя в вашем случае у вас было только 1 API на данный момент, когда вы хотите выполнять обработку ошибок, поэтому это второе решение функции хорошо подходит. – nikhil

1

Чтобы справиться с этим, нам нужно будет добавить службу/фабрику для перехвата http-звонков. Вы можете сделать это, как это в вашей конфигурации

$httpProvider.interceptors.push('httpRequestInterceptor'); 

Теперь, выше сервис будет что-то вроде этого

angular.module("app").factory('httpRequestInterceptor', function ($q) { 

      return { 
       'request': function (config) { 

        // Extract request information 
        return config || $q.when(config); 
       }, 
       'responseError': function(rejection) { 

        // Extract response error information and handle errors 
        return $q.reject(rejection); 
       } 
      } 
     }); 
+0

@CaptSaltyJack - Вы проверили? Будет ли это работать на вас? – nikhil

+0

Ничего себе, это большая работа для чего-то такого простого. Я не знаю, будет ли это работать для меня. Мне нужно, чтобы обработка ошибок находилась в определенном контроллере, потому что обработка ошибок должна быть специфичной для определенной страницы. – CaptSaltyJack

+0

В пределах определенного контроллера будет обозначаться конкретный маршрут/состояние тоже? – nikhil