Угловая обработка глобальной ошибки - укажите модуль, в котором произошла ошибка
У меня есть приложение Angular, созданное для размещения нескольких дочерних приложений. В этом приложении я реализовал GlobalErrorHandlerService
который отменяет значение по умолчанию Angular ErrorHandler
:
глобальные ОШИБКИ handler.service.ts
import { Injectable, ErrorHandler, Injector } from '@angular/core';
import {ErrorLogger} from '../services/error-logger.service';
import { HttpErrorResponse } from '@angular/common/http';
// Global error handler for logging errors
@Injectable()
export class GlobalErrorHandlerService extends ErrorHandler {
constructor(private injector : Injector, private errorLoggerService: ErrorLoggerService) {
super();
}
handleError(error: any) {
let loggerService = this.injector.get(ErrorLoggerService);
loggerService.logError(error)
.subscribe(
data => console.warn(data),
error => {throw error},
() => console.log("empty")
);
}
}
Это автоматически отлавливает все ошибки и отправляет их в глобальный ErrorLoggerService
для регистрации этих ошибок в базе данных:
ОШИБОК logger.service.ts
import { Injectable } from '@angular/core';
import { HttpClient, HttpResponse, HttpRequest, HttpHeaders, HttpInterceptor, HttpHandler, HttpEvent, HttpParams, HttpErrorResponse} from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { from } from 'rxjs';
import { map, filter, catchError, mergeMap } from 'rxjs/operators';
import { AppConstants } from '../app-constants/app-constants';
@Injectable({
providedIn: 'root'
})
export class ErrorLoggerService {
constructor(private http: HttpClient) { };
logError(error: any):Observable<any> {
const date = new Date().toUTCString();
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json'
}),
withCredentials: true
};
//******** log errors based on type ********//
if (error instanceof HttpErrorResponse) {
//** POST error to db **//
return this.http.post('http://path-to-my-api-model-which-logs-to-db',
{ Date: date, type: error.type, message: error.message, stackTrace: "testStackTraceSERVICE", lineNumber: "testLineNumber", code: "testCode" },
httpOptions)
}
else if (error instanceof TypeError) {
//** POST error to db **//
return this.http.post('http://path-to-my-api-model-which-logs-to-db',
{ Date: date, type: error.name, message: error.message, stackTrace: error.stack, lineNumber: "TypeError lineNumber", code: "testCode" },
httpOptions)
}
else if (error instanceof Error) {
console.error(date, AppConstants.generalError, error.message, error.stack);
}
else if(error instanceof ErrorEvent){
//A client-side or network error occurred. Handle it accordingly.
console.error(date, AppConstants.generalError, error.message, error.filename);
}
else {
console.error(date, AppConstants.somethingHappened, error.message, error.stack);
}
}
}
Это правильно записывает в БД. Но в этой таблице базы данных, которая регистрирует наши ошибки, я хотел бы создать Application
и, надеюсь, заполните это именем дочернего приложения, в котором произошла ошибка.
Как я могу сделать это? Есть ли способ вытащить модуль, в котором произошла ошибка, или подобное? Таким образом, я могу обернуть ErrorLoggerService
условия в большем операторе if, который читает что-то вроде:
if (error is from Application A) {
var appName = Application A;
//log errors to db
} else if (error is from Application B) {
var appName = Application A:
//log errors to db
}