2017-03-22 5 views
4

주입되었을 때 내 서비스 (this.loggerService)가 내 DataHandlerService에서 정의되지 않은 이유는 무엇입니까? 나는 의존성 주입이 이것을 처리했다고 생각했습니다. 내 loggerService는 다른 서비스에서 작동합니다. 내가 어디로 잘못 가고 있는지 깨닫도록 도와주세요. 아래 내 DataHandlerService 코드 : 아래2 앵귤러 2 주사 서비스가 정의되지 않았습니다

import { Injectable } from '@angular/core'; 
import { Http, Response } from '@angular/http'; 
import { Observable } from 'rxjs/Observable'; 
import { LoggerService } from './logger.service'; 

@Injectable() 

export class DataHandlerService 
{ 
constructor(private loggerService: LoggerService) 
{ 

} 

extractData(res: Response) 
{ 
    let body = res.json(); 
    return body || {}; 
} 


handleHttpError(error: any) 
{ 
    let errMsg = (error.message) ? error.message : error.status ? `${error.status} - ${error.statusText}` : 'Server error'; 

    if (errMsg && this.loggerService) //Why is this.loggerService always undefined? 
    { 
     this.loggerService.error(errMsg); 
    } 

    return Observable.throw(errMsg); 
} 
} 

내 LoggerService 코드 : 아래

import { Injectable } from '@angular/core'; 
import { Http, Headers, Response } from '@angular/http'; 
import { Observable } from 'rxjs/Observable'; 
import { ConfigurationService } from './configuration.service'; 

@Injectable() 

export class LoggerService 
{ 
constructor(private http: Http, private configurationService: ConfigurationService) 
{ 

} 

public fatal(msg: string) 
{ 
    if (msg) 
    { 
     this.log(msg, "Fatal"); 
    } 
} 

public debug(msg: string) 
{ 
    if (msg) 
    { 
     this.log(msg, "Debug"); 
    } 
} 

public info(msg: string) 
{ 
    if (msg) 
    { 
     this.log(msg, "Info"); 
    } 
} 

public warn(msg: string) 
{ 
    if (msg) 
    { 
     this.log(msg, "Warn"); 
    } 
} 

public error(msg: string) 
{ 
    if (msg) 
    { 
     this.log(msg, "Error"); 
    } 
} 

private log(msg: string, logLevel: string) 
{ 
    if (msg && logLevel && this.configurationService && this.configurationService.coreSettings) 
    { 
     let headers = new Headers(); 
     headers.append('Content-Type', 'application/json'); 
     headers.append('Accept', 'application/json'); 

     let loggingInfo: LoggingInfo = { "message": msg, "logLevel": logLevel, "sourceName": "CoreIV", "logDirectory": this.configurationService.coreSettings.logDirectory }; 

     this.http.post(this.configurationService.coreSettings.logbookUrl + "/rest/LogMessage", { loggingInfo }, { headers: headers }) 
      .toPromise() 
      .then(res => this.extractData(res)) 
      .catch(err => this.handleHttpError(err)); 
    } 
} 

private extractData(res: Response) 
{ 
    let body = res.json(); 
    return body || {}; 
} 

private handleHttpError(error: any) 
{ 
    let errMsg = (error.message) ? error.message : 
     error.status ? `${error.status} - ${error.statusText}` : 'Server error'; 
    return Observable.throw(errMsg); 
} 



} 

export interface LoggingInfo 
{ 
    message: string, 
    logLevel: string, 
    sourceName: string, 
    logDirectory: string 

} 

내 App.Module 코드 : 나는에 서비스를 가져 오기에 실패 할 때

import { NgModule, APP_INITIALIZER, ErrorHandler } from '@angular/core'; 
import { LocationStrategy, HashLocationStrategy } from '@angular/common'; 
import { HttpModule, JsonpModule, Jsonp } from '@angular/http'; 
import { BrowserModule } from '@angular/platform-browser'; 
import { FormsModule, FormGroup, FormControl, ReactiveFormsModule } from '@angular/forms'; 
import { routing, appRoutingProviders } from './app.routing'; 
import { AppConfig } from './app.config'; 

import { AppComponent } from './app.component'; 
import { HomeComponent } from './home/home.component'; 
import { AppErrorHandler, LOGGING_ERROR_HANDLER_OPTIONS,  LOGGING_ERROR_HANDLER_PROVIDERS } from './app.error-handler'; 

import { AppService } from './app.service'; 
import { ConfigurationService } from './shared/services/configuration.service'; 
import { DataHandlerService } from './shared/services/data-handler.service'; 
import { LoggerService } from './shared/services/logger.service'; 
import { AuthGuard } from './auth-guard.service'; 

export function init_app(appConfig: AppConfig, configurationService: ConfigurationService, loggerService: LoggerService) 
{ 
// Do initiating of services that are required before app loads 
// NOTE: this factory needs to return a function (that then returns a promise) 

return appConfig.load() 
    .then((res) =>   
    { 
     configurationService.coreSettings = appConfig.config; 
    }) 
    .catch((err) => 
    { 
     loggerService.error(err); 
    }); 
} 

@NgModule({ 
imports: [ 
    BrowserModule, 
    FormsModule, 
    routing, 
    HttpModule, 
    JsonpModule 
], 
exports: [ 

], 
declarations: [ 
    HomeComponent, 
    AppComponent 
], 
providers: [ 
    HttpModule, 
    ConfigurationService, 
    LoggerService, 
    { provide: LocationStrategy, useClass: HashLocationStrategy }, 
    LOGGING_ERROR_HANDLER_PROVIDERS, 
    { 
     provide: LOGGING_ERROR_HANDLER_OPTIONS, 
     useValue: { 
      rethrowError: false, 
      unwrapError: true 
     } 
    },  
    appRoutingProviders, 
    AuthGuard,  
    DataHandlerService, 
    AppConfig,  
    { 
     provide: APP_INITIALIZER, 
     useFactory: init_app, 
     deps: [AppConfig, ConfigurationService, LoggerService], 
     multi: false 
    } 
    ], 
    bootstrap: [AppComponent, appRoutingProviders] 
    }) 


export class AppModule 
{ 
constructor(private httpModule: HttpModule) 
{ 

} 
} 
+0

어디서'DataHandlerService'와'LoggerService'를 어떻게 제공합니까? –

+0

안녕하세요. Gunter 님, 저는이 서비스를 제공하는 app.module.ts를 포함하도록 게시물을 편집했습니다. – LanceM

+0

잘못되었을 수있는 것이 없습니다. -/ –

답변

21

이 문제에 대한 해결책을 찾았습니다. 게시물 angular 2 - Injected service in http error handler의 대답은 나를 올바른 방향으로 가리켰다.

 .map(this.dataHandler.extractData) 
     .catch(this.dataHandler.handleHttpError); 

을 만 사용해야합니다 : 나는 다음을 사용했다

 .map(res => this.dataHandler.extractData(res)) 
     .catch(err => this.dataHandler.handleHttpError(err)); 

를 람다이 필요한 몇 가지 이유.

+6

저를 많이 아프게했습니다! – Bill

+0

나는 동의 할 수있다, 고마워! – Oisin

+1

람다를 사용하지 않으면 'extractData '와'handleHttpError '에서 'this'컨텍스트가 다른 곳을 가리 킵니다. 작동 시키려면 현재 컨텍스트를 바인딩 할 수 있습니다. .map (this.dataHandler.extractData.bind (this) .catch (this.dataHandler.handleHttpError.bind (this)); –

1

이 나에게 발생 기본 앱 모듈 및 제공자 섹션에 나열하십시오.

// in app.module.ts  
import { LoggerService } from './logger.service'; 
... 
@NgModule({ 
... 
    providers: [ 
    LoggerService, 
+0

안녕하세요. Robert, 내 app.module.ts를 포함하도록 게시물을 편집했습니다. – LanceM