Как получить лучшую трассировку стека на угловых ошибках - PullRequest
1 голос
/ 14 марта 2019

В настоящее время, когда я получаю ошибку в своем производственном приложении Angular (v7), я получаю трассировку стека, подобную этой. Но это практически невозможно получить какую-либо значимую информацию от. Как я могу получить лучшую трассировку стека, чтобы я мог сузить источник этой неуловимой ошибки? Прямо сейчас я живу с этой ошибкой в ​​prod, потому что она никогда не возникает на моей машине для разработки, и я не знаю, как ее изолировать, потому что трассировка стека практически бесполезна для меня. Я привык к таким языкам, как C #, где вы получаете очень краткую трассировку стека, которая дает вам карту с ошибочной функцией. Эта трассировка стека не имеет смысла.

TypeError: Cannot read property 'appendChild' of null
at create_dom_structure (eval at  (:15:1), :1:16231)
at load_map (eval at  (:15:1), :1:101028)
at Object.load (eval at  (:15:1), :1:107834)
at eval (eval at  (:15:1), :1:108251)
at t.invokeTask (https://mywebsite.com/polyfills.d8680adf69e7ebd1de57.js:1:8844)
at Object.onInvokeTask (https://mywebsite.com/main.25a9fda6ea42f4308b79.js:1:467756)
at t.invokeTask (https://mywebsite.com/polyfills.d8680adf69e7ebd1de57.js:1:8765)
at e.runTask (https://mywebsite.com/polyfills.d8680adf69e7ebd1de57.js:1:4026)
at e.invokeTask (https://mywebsite.com/polyfills.d8680adf69e7ebd1de57.js:1:9927)
at invoke (https://mywebsite.com/polyfills.d8680adf69e7ebd1de57.js:1:9818)

Мой обработчик ошибок:

export class AppErrorHandler extends ErrorHandler {

constructor(
    private _http: Http,
    private injector: Injector,
) {
    super();
}

public handleError(error: any): void {
    if (error.status === '401') {
        alert('You are not logged in, please log in and come back!');
    } else {
        const router = this.injector.get(Router);

        const reportOject = {
            status: error.status,
            name: error.name,
            message: error.message,
            httpErrorCode: error.httpErrorCode,
            stack: error.stack,
            url: location.href,
            route: router.url,
        };
        this._http.post(`${Endpoint.APIRoot}Errors/AngularError`, reportOject)
            .toPromise()
            .catch((respError: any) => {
                Utils.formatError(respError, `AppErrorHandler()`);
            });
    }
    super.handleError(error);
}
}

1 Ответ

1 голос
/ 14 марта 2019

Обычно трассировки стека Javascript более полезны.К сожалению, в производственном приложении вы обычно включаете минификацию, поэтому вы получаете такой нечитаемый беспорядок.

Если вы можете позволить себе больший комплект Javascript, может быть полезно отключить минификацию, чтобы получить лучшую трассировку стека в производстве.

Как это сделать, зависит от версииуглового CLI, который вы используете.Для CLI v7:

В файле angular.json установите следующие свойства

{
  ...
  "projects": {
    "my-project": {
      ...
      "architect": {
        "build": {
          ...
          "configurations": {
            "production": {
              "optimization": false,
              "buildOptimizer": false,
              ...
            }
    ...
}

Альтернативные решения в этот вопрос

...