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)
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
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. –
.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}) –