Мы разрабатываем одностраничное приложение с API-интерфейсом AngularJS и ASP.NET MVC Json Rest.
Когда неавторизованный клиент пытается перейти на частный маршрут (Ex:/Foo/Home/Template), чтобы получить шаблон, он получает ответ 401 от веб-API, и наше приложение AngularJS автоматически перенаправляет его на страницу входа в систему.
Мы обрабатываем 401 с $http перехватчиком с чем-то вроде этого:
if (response.status === 401) {
$location.path(routeToLogin);
return $q.reject(response);
}
Ввод правильных учетных данных позволяет клиенту получить шаблон.
Все работает отлично, за исключением одной детали; консоль Javascript сообщает об этой ошибке:
Error: [$compile:tpload] http://errors.angularjs.org/1.3.0/$compile/tpload?p0=%Foo%2FHome%2FTemplate%2F
Документация AngularJs гласит:
Описание
Эта ошибка возникает, когда компиляция $пытается получить шаблон из некоторого URL, и запрос не работает.
В нашем приложении AngularJs запрос выходит из строя, но он по дизайну, потому что ресурс есть, но к нему нельзя получить доступ (401).
Должен ли я двигаться дальше и принимать такую ошибку на консоли или можно ее отключить или экранировать?
EDIT:
Я немного отлаживал источник angular, и я нашел, какая часть кода создает исключение.
Поскольку мы используем TemplateUrl
для объявления наших шаблонов, мы косвенно используем функцию compileTemplateUrl
, которая выполняет этот вызов:
$templateRequest($sce.getTrustedResourceUrl(templateUrl))
это оставляет второй параметр (ignoreRequestError
) templateRequest
undefined.
ignoreRequestError (необязательно) boolean
Следует ли игнорировать исключение, когда запрос терпит неудачу, или шаблон пуст
Когда наш HTTP-перехватчик, обрабатывающий код статуса 401, отклоняет обещание, $http.get внутри $TemplateRequestProvider
выходит из строя и вызывает эту функцию:
function handleError() {
self.totalPendingRequests--;
if (!ignoreRequestError) {
throw $compileMinErr('tpload', 'Failed to load template: {0}', tpl);
}
return $q.reject();
}
Я считаю, что мы не можем ничего сделать, чтобы предотвратить ошибку на консоли, поскольку TemplateUrl
не позволяет установить флаг ignoreRequestError
в значение false.
Я попытался обойти отклонение в случае кода состояния 401; это исправляет ошибку на консоли, но, к сожалению, она имеет побочный эффект: пустой шаблон неправильно кэшируется в TemplateCache
, вызывающий проблемы.