Угловая обработка глобальной ошибки - укажите модуль, в котором произошла ошибка

У меня есть приложение 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
}

0 ответов

Другие вопросы по тегам