2013-08-08 3 views
4

У меня возникают проблемы с попыткой изящно обрабатывать ошибки $ http. Я перебираю список серверов, чтобы вызвать вызовы API для статуса. Звонки, которые успешно завершатся отлично. Те, которые терпят неудачу, не дают мне доступ к информации об ошибках. Это всегда неопределенно. Вот фрагмент кода:Угловая ответная реакция HTTP-ответа HTTP всегда не определена

angular.forEach($scope.servers, function (server) { 
    // blank out results first 
    server.statusResults = {}; 

    $http.jsonp(server.url + '/api/system/status?callback=JSON_CALLBACK', {headers: { 'APP-API-Key': server.apiKey }}). 
     success(function (data, status, headers, config) { 
      server.statusResults = data; 
     }). 
     error(function (data, status, headers, config) { 
      // data is always undefined here when there is an error 
      console.error('Error fetching feed:', data); 
     }); 
    } 
); 

Выход консоли показывает правильные 401 ошибку (который я не сделал вывод) и мое сообщение об ошибке консоли (что я и сделал вывод) с неопределенным объектом данных.

GET https://server_address/api/system/status?callback=angular.callbacks._1 401 (Unauthorized) angular.min.js:104 
Error fetching feed: undefined 

То, что я пытаюсь сделать, это НЕ имеет угловую дисплей 401 в журнале, и вместо этого я отобразить его в изящный способ. Однако, поскольку данные не определены, у меня нет доступа к информации.

Я новичок в AngularJS, но мой пример близко соответствует другим примерам, которые я нашел в документации.

Я также пытался использовать $ resource вместо $ http и получил ту же самую проблему.

var statusResource = $resource(server.url + '/api/system/status', {alt: 'json', callback: 'JSON_CALLBACK'}, 
       { status: {method: 'JSONP'}, isArray: false, headers: { 'APP-API-Key': server.apiKey } }); 

// make status API call 
statusResource.status({}, function (data) { 
    server.statusResults = data; 
}, function (err) { 
    // data is always undefined here when there is an error 
    console.log(err); 
}); 

Я, вероятно, делаю что-то явно неправильно, но я не уверен, что еще попробовать.

+0

Как выглядит ответ сервера? – Pointy

+1

Также [см. Этот интересный вопрос и ответ] (http://stackoverflow.com/questions/14517709/how-to-get-data-from-jsonp-error-callback-in-angularjs). – Pointy

ответ

0

Пер с $httpdocs, body является

Тело ответа трансформирует функцию преобразования.

С ошибкой 401 (Несанкционированная), которую вы возвращаете, вполне возможно, что тела не возвращаются, поэтому почему это не определено.

Для того, чтобы зарегистрировать код ошибки, необходимо вместо этого зарегистрировать параметр status. Он содержит код состояния HTTP, который должен быть однородным, в отличие от органов реагирования.

+0

Спасибо, но это не сработало. Ошибка 401, но код состояния возвращает 0. –

+1

Я пропустил, что вы использовали JSONP. Вы не можете поймать код ошибки с помощью JSONP. См. Ссылку @Pointy в своем комментарии, в частности [этот ответ] (http://stackoverflow.com/a/1002797/1904517), который связан в комментарии. – iagreen

+0

Спасибо. Ссылка из Уэнтэ объяснила это очень хорошо. Я собираюсь посмотреть ближе в CORS. Я предполагаю, что это также решило бы эту проблему? –

Смежные вопросы