Actuellement, mon Angular est constitué d'un nombre important de sous-modules et de composants. Angular applications sont assez sensibles aux erreurs de rendu HTML. Par exemple, si nous obtenons un NULL objet d'une API et essayant d'avoir accès à sa propriété, il rompt partiellement le rendu de l'application.
Il est assez difficile de gérer et de tester de tels cas en tenant compte de la croissance constante. Savez-vous s'il est possible de créer un script pouvant enregistrer toutes les erreurs apparaissant dans une console?
Ici ce que j'ai obtenu:
1) ne poignée d'erreur de demande HTTP Pour enregistrer les demandes cassées d'une API:
private handleError<T> (operation = 'operation', result?: T) {
return (error: any): Observable<T> => {
// TODO: send the error to remote logging infrastructure
console.error(error); // log to console instead
// TODO: better job of transforming error for user consumption
this.log(`${operation} failed: ${error.message}`);
// Let the app keep running by returning an empty result.
return of(result as T);
};
}
2) enregistreur côté client Mais pour une raison quelconque, il ne fait que connecter des erreurs à partir de crawlers :)
<script>
window.onerror = function(m,u,l,c) {
if (window.XMLHttpRequest) {
var xhr = new XMLHttpRequest();
var data = "msg="+encodeURIComponent(m)
+"&url="+encodeURIComponent(u)
+"&line="+l
+"&col="+c
+"&href="+encodeURIComponent(window.location.href);
xhr.open("GET", "logger.php?"+data, true);
xhr.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");
xhr.send();
}
};
</script>
Il serait très utile d'obtenir un script pouvant simplement enregistrer toutes les erreurs de la console et
Lorsque j'ai commencé à travailler avec angulaire, j'ai trouvé cet article utile: Angular: Ajout de la journalisation Angular Applications .
Si vous suivez la guidage, vous vous retrouvez avec un loggingService que vous pouvez configurer pour enregistrer des erreurs sur l'un des trois (ou tous) emplacements:
Ce que l'article laisse, c'est comment attraper les erreurs automatiquement. Vous pouvez le faire avec un httpterceptor . Voici un exemple d'une application que je travaille sur:
http-demande-interceptor.ts
import { Injectable } from '@angular/core';
import { HttpEvent, HttpHandler, HttpRequest, HttpErrorResponse, HttpInterceptor } from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { retry, catchError } from 'rxjs/operators';
import { Router } from '@angular/router';
import { LogService } from '../services/log.service';
@Injectable()
export class HttpRequestInterceptor implements HttpInterceptor {
constructor (private logService: LogService, private router: Router) { }
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const newReq = req.clone({
headers: req.headers.set('Content-Type', 'application/json'),
withCredentials: true
});
return next.handle(newReq)
.pipe(
retry(1),
catchError((error: HttpErrorResponse) => {
let displayError = '';
let serverError = '';
let clientError = '';
if (error.error instanceof ErrorEvent) {
// client-side error
clientError = `Error: ${error.error.message}`;
this.logService.error(clientError);
} else {
// server-side error
displayError = error.error;
serverError = `Error Code: ${error.status}\n${error.message}\n${error.error}`;
if (error.status === 401) {
this.logService.error(serverError);
this.router.navigate(['/unauthorized', { message: error.error}]);
}
if (error.status >= 500) {
this.logService.error(serverError);
this.router.navigate(['/error']);
}
}
return throwError(displayError);
})
);
}
}
Httpintercepteurs sont très puissants. Celui-ci fait ce qui suit:
Pour enregistrer un httpterceptor dans votre application, vous avez besoin d'un module:
http-interceptor.module.ts
import { NgModule } from '@angular/core';
import { HTTP_INTERCEPTORS } from '@angular/common/http';
import { HttpRequestInterceptor } from './http-request-interceptor';
@NgModule({
providers: [
{ provide: HTTP_INTERCEPTORS,
useClass: HttpRequestInterceptor,
multi: true
}
]
})
export class HttpInterceptorModule { }
Ensuite, vous enregistrez ce module dans votre fichier app.module.ts et l'inclure dans les importations Array.