2016-07-12 9 views
5

Ich implementiere einen Logger für mein ganzes MEAN.js Projekt. Ich habe einen serverseitigen Logger, der gut funktioniert, und ich habe einen Endpunkt festgelegt, der eine POST-Anforderung mit einer Ausnahme zum Protokollieren eines Clientfehlers empfängt. Ich verwende StackTrace.js für clientseitige Fehlerprotokollierung, aber ich erhalte einige Fehler; Jetzt benutze ich StackTrace's Fehler-Stack-Parser und bekomme immer noch Fehler. Ich bin mit einem Dekorateur auf Angular von $ Exception dies zu erreichen:Verwenden von StackTrace.js mit 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 ist ein Winkel Dienst, der für Stacktrace/Fehler-Stack-Parser fungiert als Proxy dient. traceService.parse entspricht ErrorStackParser.parse. traceService implementiert als:

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

ich diesen Dekorateur Code auf dem Angular App Bootstrap gesetzt haben, und ich bin Tests von auf einem Controller einen Fehler werfen. Wenn ich die app laufen bekomme ich diesen Fehler auf der Client-Konsole:

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) 

es so scheint, wäre es ein Problem mit fehlern Stack-Parsing; Ich kann anscheinend keine Artikel zu diesem Thema finden, also bin ich mir sicher, dass ich etwas falsch mache, so wie ich es teste oder etwas anderes. Kann man einen Einblick geben, warum dies scheitert?

bearbeiten

modifizierte ich den Code Kommentar folgenden Caramiriel ist. Es scheint, als ob ich alle Funktionen von Fehler-Stack-Parser zu meinem Dienst hinzufügen muss. Dies ist traceService:

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

Jetzt bin bekomme ich diesen Fehler:

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

Wie wird 'traceService.parse' implementiert? Du bist irgendwie der ursprüngliche Kontext ('this'), aber mit dem von dir bereitgestellten Code ist unklar, warum. Möglicherweise müssen Sie das ursprüngliche Objekt "binden". – Caramiriel

+0

Ich habe die Frage bearbeitet, um die Informationen hinzuzufügen. Ich habe auch den 'traceService' Code geändert und jetzt bekomme ich einen anderen Fehler. –

+0

.factory ('traceService', function() { \t return ({ \t parse: 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}) –

Antwort

2

Es sieht aus wie Sie Fehler-Stack-Parser ohne seine Abhängigkeit vom Stapelrahmen Projekt verwenden.

Sie erhalten diese Abhängigkeit automatisch, wenn Sie npm oder bower verwenden.