gpt4 book ai didi

Angular 2注入(inject)服务未定义

转载 作者:太空狗 更新时间:2023-10-29 16:57:00 27 4
gpt4 key购买 nike

为什么我的服务 (this.loggerService) 在注入(inject)后未在我的 DataHandlerService 中定义?我认为依赖注入(inject)解决了这个问题。我的 loggerService 在其他服务中工作。请帮助我意识到我哪里出错了。我的 DataHandlerService 代码如下:

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)
{

}
}

最佳答案

我找到了这个问题的解决方案。帖子里的答案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));

出于某种原因需要 lambda。

关于Angular 2注入(inject)服务未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42956852/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com