Как включить ведение журнала ошибок только в производственной среде? - PullRequest
0 голосов
/ 26 июня 2018

У меня есть приложение Angular 5 с регистрацией ошибок с использованием sentry.io, которое использует raven.js.

У меня все это работает правильно, но я не хочу регистрировать ошибки при запуске в разработке. Как включить ведение журнала ошибок только при включенном производственном режиме?

В моем app.module.ts

есть следующее
import * as Raven from 'raven-js';

Raven
  .config('https://xxx@sentry.io/xxx')
  .install();

export class RavenErrorHandler implements ErrorHandler {
  handleError(err: any): void {
    Raven.captureException(err);
  }
}

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Если вы используете angular-cli, у них есть файлы окружения, которые вы можете просто сделать

if (environment.production) { ... }

0 голосов
/ 12 марта 2019

Я думал, что стоит поделиться, потому что у меня была похожая проблема, где я хотел ...

  • использовать мой Sentry.io errorHandler только в производстве
  • использовать Angular по умолчанию ErrorHandler в dev
  • вставлять зависимости в обработчик

app.error-handler.ts

Первым шагом является реализация фабричной функции поставщика, которая возвращает либо SentryErrorHanddler, либо значение Angular по умолчанию ErrorHandler на основе свойства environment.production и получение необходимой зависимости в качестве параметра.

import { ErrorHandler } from '@angular/core';
import * as Sentry from '@sentry/browser';
import { environment } from '../environments/environment';

export function errorHandlerFactory(toastService: ToastService) {
  if (environment.production) {
    return new SentryErrorHandler(toastService);
  }
  return new ErrorHandler();
}

Вторым шагом является реализация класса SentryErrorHandler, который получит зависимость в конструкторе (обратите внимание, что я не префикс класса с @Injectable decorator, потому что он будет создан на фабрике выше, а не введен ДИ) .

export class SentryErrorHandler implements ErrorHandler {
  constructor(public toastService: ToastService) {
    Sentry.init({
      dsn: 'https://<YOUR-SENTRY-KEY>@sentry.io/<YOUR-PROJECT-ID>',
    });
  }

  handleError(error: any) {
    Sentry.captureException(error.originalError || error);
    this.toastService.show('An error occurs, please try again later.');
    throw error;
  }
}

app.module.ts

Наконец, в AppModule укажите ErrorHandler с реализованным фабричным провайдером errorHandlerFactory и укажите, что ему нужна некоторая зависимость от внедрения через свойство deps, которое будет передано в качестве параметра в функцию провайдера фабрики

import { ErrorHandler } from '@angular/core';
import { errorHandlerFactory } from './app.error-handler';

@NgModule({
  //...
  providers: [
    { provide: ErrorHandler, useFactory: errorHandlerFactory, deps: [ToastService] },
  ],
})
export class AppModule { }

Обратите внимание, что все, что связано с ToastService, приведено только в качестве примера для представления внешней зависимости, к которой вы хотите обратиться в свой пользовательский обработчик.

0 голосов
/ 26 июня 2018

Вы должны использовать функцию isDevMode

import { isDevMode } from '@angular/core';

export class AppComponent { 
  constructor() {
    console.log(isDevMode());
  }
}

если значение true не возвращается, оно должно быть равно

...