2016-07-12 11 views
5

Tüm MEAN.js projem için bir günlük kaydedici uyguluyorum. İyi çalışan bir sunucu tarafı günlüğüm var ve bir istemci hatası için bir özel durum ile bir POST isteği almak için bir son nokta belirledim. İstemci tarafı hata kaydı için StackTrace.js kullanıyorum, ancak bazı hatalar alıyorum; Şimdi StackTrace'ın error-stack-parser kullanıyorum ve hala hatalar alıyorum. Bunu başarmak için açısal en $ exceptionHandler bir dekoratör kullanıyorum:Angular.js ile StackTrace.js'yi kullanma

$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 StackTrace/hata-yığın-ayrıştırıcı işlevler için bir proxy olarak davranan bir Açısal hizmettir. traceService.parse, ErrorStackParser.parse'a eşdeğerdir. Ben Açısal uygulaması açılışta bu dekoratör kodunu koyduk

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

ve bir denetleyici bir hata atarak test ediyorum: olarak traceService uygulanmaktadır. Ben app çalıştırdığınızda İstemci konsolda bu hatayı alıyorum:

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) 
Böyle görünüyor

hata yığın-ayrıştırma ile bir konudur; Bu konuyla ilgili herhangi bir makale bulamıyorum, bu yüzden eminim ki yanlış yaptığım bir şey, test ettiğim ya da başka bir şey. Bunun neden başarısız olduğuna dair herhangi bir fikir verebilir misiniz?

Düzenleme ben Caramiriel yorumuyla aşağıdaki kodu güncellenmiştir. Hata-yığın ayrıştırıcısından tüm işlevleri hizmetime eklemem gerekiyor gibi görünüyor. Bu traceService geçerli:

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

Şimdi bu hatayı alıyorum: Eğer StackFrame projesi, bağımlı olmadan hatasız yığını-ayrıştırıcı kullanıyorsunuz gibi

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

TraceService.parse nasıl uygulanır? Bir şekilde orijinal bağlam sensin ('bu'), ancak sağladığınız kodu neden belirsiz. Orijinal nesneyi '.bind' yapmanız gerekebilir. – Caramiriel

+0

Bilgileri eklemek için soruyu düzenledim. Ayrıca traceService kodunu değiştirdim ve şimdi farklı bir hata alıyorum. –

+0

.factory ('traceService', fonksiyon() { \t dönüş ({ \t ayrıştırma: 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}) –

cevap

2

görünüyor.

npm veya bower kullanıyorsanız, bu bağımlılığı otomatik olarak alırsınız.