Cómo evitar $ compile: errores de tpload en la respuesta del código de estado 401
Estamos desarrollando una aplicación de una sola página con AngularJS y ASP.NET MVC Json Rest API.
Cuando un cliente no autenticado intenta navegar a una ruta privada (Ej:/ Foo / Inicio / Plantilla) para obtener una plantilla, obtiene una respuesta 401 de la API web y nuestra aplicación AngularJS la redirige automáticamente a la página de inicio de sesión.
Estamos manejando el 401 con$ http interceptor con algo como esto:
if (response.status === 401) {
$location.path(routeToLogin);
return $q.reject(response);
}
Ingresar las credenciales correctas le permite al cliente obtener la plantilla.
Todo funciona perfectamente, excepto un detalle; la consola Javascript informa este error:
Error: [$compile:tpload] http://errors.angularjs.org/1.3.0/$compile/tpload?p0=%Foo%2FHome%2FTemplate%2F
Documentación de AngularJs declara esto:
Descripción
Este error se produce cuando $ compile intenta recuperar una plantilla de alguna URL y la solicitud falla.
En nuestra aplicación AngularJs, la solicitud falla pero es por diseño porque el recurso está allí pero no se puede acceder (401).
¿Debo seguir adelante y aceptar este tipo de error en la consola o es posible silenciarlo o protegerlo de alguna manera?
EDITAR:
He depurado un poco la fuente angular y descubrí qué parte del código está generando la excepción.
Ya que estamos usandoTemplateUrl
para declarar nuestras plantillas, indirectamente estamos usando la funcióncompileTemplateUrl
eso hace esta llamada:
$templateRequest($sce.getTrustedResourceUrl(templateUrl))
esto deja el segundo parámetro (ignoreRequestError
) detemplateRequest
indefinido
ignoreRequestError (opcional) booleano
Si se debe ignorar o no la excepción cuando la solicitud falla o la plantilla está vacía
Cuando nuestro interceptor http, que maneja el código de estado 401, rechaza la promesa, el $ http.get dentro del$TemplateRequestProvider
falla y llama a esta función:
function handleError() {
self.totalPendingRequests--;
if (!ignoreRequestError) {
throw $compileMinErr('tpload', 'Failed to load template: {0}', tpl);
}
return $q.reject();
}
Creo que no podemos hacer nada para evitar el error en la consola comoTemplateUrl
no permite configurar elignoreRequestError
bandera a falso
He tratado de evitar el rechazo en caso de código de estado 401; esto corrige el error en la consola, pero lamentablemente tiene un efecto secundario: una plantilla vacía está mal almacenada en cachéTemplateCache
causando otros problemas.