2016-07-12 18 views
5

Wprowadzam program rejestrujący dla całego mojego projektu MEAN.js. Mam program rejestrujący po stronie serwera, który działa dobrze i ustawiłem punkt końcowy, aby odebrać żądanie POST z wyjątkiem, aby zarejestrować błąd klienta. Używam StackTrace.js do rejestrowania błędów po stronie klienta, ale dostaję błędy; teraz używam programu StackTrace do parowania stosów błędów i wciąż dostaję błędy. Używam dekorator na kątowym za $ exceptionHandler do osiągnięcia tego celu:Używanie StackTrace.js z Angular.js

$provide.decorator("$exceptionHandler", 
    function($delegate, traceService, $log, $window) { 
    return function(exception, cause) { 
    $delegate(exception, cause); 
    try { 
     var errorMessage = exception.toString(); 
     var stackTrace = traceService. 
     parse(exception). 
     then(function(stackFrames) { 
     $.ajax({ 
      type: 'POST', 
      url: '/logger', 
      contentType: 'application/json', 
      data: angular.toJson({ 
      url: $window.location.href, 
      message: errorMessage, 
      type: 'exception', 
      stackFrace: stackFrames, 
      cause: cause || '' 
      }) 
     }).fail(function() { 
      $log.warn('POST request failed'); 
     }); 
     }).catch(function(error) { 
     $log.warn('Error StackTrace'); 
     }); 
    } catch (loggingError) { 
     $log.warn('Error server-side logging failed'); 
     $log.log(loggingError); 
    } 
    }; 
}); 

traceService jest kątowym serwis, który działa jako serwer proxy dla StackTrace funkcji/error-stack-parsera. traceService.parse jest odpowiednikiem ErrorStackParser.parse. traceService jest zaimplementowany jako:

angular.module('core').factory('traceService', function() { 
    return { 
    parse: ErrorStackParser.parse 
    }; 
}); 

Włożyłam ten kod dekorator na Kątowymi aplikacji bootstrap, a ja testowania przez rzucanie błąd na kontrolerze. Kiedy uruchomić aplikację otrzymuję ten błąd na konsoli klienta:

Error server-side logging failed 
angular.js:13708 TypeError: this.parseV8OrIE is not a function 
at Object.ErrorStackParser$$parse [as parse] (error-stack-parser.js:70) 
at application.js:22 
at invokeLinkFn (angular.js:9816) 
at nodeLinkFn (angular.js:9215) 
at compositeLinkFn (angular.js:8510) 
at publicLinkFn (angular.js:8390) 
at lazyCompilation (angular.js:8728) 
at updateView (viewDirective.ts:278) 
at Object.configUpdatedCallback [as configUpdated] (viewDirective.ts:226) 
at configureUiView (view.ts:164) 

Wydawałoby się, jak to jest problem z błędu stosu-parse; Nie mogę znaleźć żadnych artykułów dotyczących tego problemu, więc jestem pewien, że jest to coś, co robię źle, sposób, w jaki testuję lub coś innego. Czy ktokolwiek może podać wgląd w przyczyny niepowodzenia?

Edit

I zmodyfikowany kod następujący komentarz Caramiriel użytkownika. Wygląda na to, że muszę dodać wszystkie funkcje z parsera błędów do mojej usługi. To traceService:

angular.module('core').factory('traceService', function() { 
    return { 
    parse: ErrorStackParser.parse, 
    parseV8OrIE: ErrorStackParser.parseV8OrIE, 
    extractLocation: ErrorStackParser.extractLocation 
    }; 
}); 

Teraz dostaję ten błąd:

TypeError: StackFrame is not a constructor 
at Object.<anonymous> (http://localhost:3000/lib/error-stack-parser/error-stack-parser.js:105:24) 
at Array.map (native) 
at _map (http://localhost:3000/lib/error-stack-parser/error-stack-parser.js:22:26) 
at Object.ErrorStackParser$$parseV8OrIE [as parseV8OrIE] (http://localhost:3000/lib/error-stack-parser/error-stack-parser.js:95:20) 
at Object.ErrorStackParser$$parse [as parse] (http://localhost:3000/lib/error-stack-parser/error-stack-parser.js:70:29) 
at http://localhost:3000/application.js:22:11 
at invokeLinkFn (http://localhost:3000/lib/angular/angular.js:9816:9) 
at nodeLinkFn (http://localhost:3000/lib/angular/angular.js:9215:11) 
at compositeLinkFn (http://localhost:3000/lib/angular/angular.js:8510:13) 
at publicLinkFn (http://localhost:3000/lib/angular/angular.js:8390:30) 
+0

W jaki sposób zaimplementowano 'traceService.parse'? W pewnym sensie jesteś oryginalnym kontekstem ("ten"), ale nie wiesz, dlaczego z podanym przez Ciebie kodem. Być może będziesz musiał ".indy" oryginalny obiekt. – Caramiriel

+0

Edytowałem pytanie, aby dodać informacje. Zmieniłem również kod 'traceService' i teraz otrzymuję inny błąd. –

+0

Fabryce umiejscowionej ('traceService', funkcja() { \t zwrotny ({ \t analizy składniowej: ErrorStackParser.parse, \t \t extractLocation: ErrorStackParser.extractLocation, \t \t parseV8OrIE: ErrorStackParser.parseV8OrIE, \t \t parseFFOrSafari: ErrorStackParser. parseFFOrSafari, \t \t parseOpera: ErrorStackParser.parseOpera, \t \t parseOpera9: ErrorStackParser.parseOpera9, \t \t parseO pera10: ErrorStackParser.parseOpera10, \t \t parseOpera11: ErrorStackParser.parseOpera11 \t}); \t \t}) –

Odpowiedz

2

Wygląda używasz błędzie stosu-parser bez jego zależność od projektu StackFrame.

Otrzymasz tę zależność automatycznie, jeśli użyjesz npm lub altanę.