【问题标题】:Cannot read property 'post' of undefined无法读取未定义的属性“帖子”
【发布时间】:2017-08-19 02:18:40
【问题描述】:

我在使用 Angular 4.3.2 中的另一个服务时遇到问题。尝试在 LoggerService 中使用“http”时出现以下错误:无法读取未定义的属性“post”。似乎 Http 服务没有被正确注入,因为它正在另一个服务中使用。如果我直接从组件调用 log 函数,它会按预期工作。

app.module.ts

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { HttpModule } from '@angular/http';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { AppComponent } from './app.component';
import { HomeComponent } from '../home/home.component';
import { CustomerDataLookupComponent } from '../customerdatalookup/customer-data-lookup.component';
import { AppRoutingModule } from './app.routing.module';
import { LoggerService } from './services/logger.service';

@NgModule({
    declarations: [
        AppComponent,
        HomeComponent,
        CustomerDataLookupComponent
    ],
    imports: [
        // Custom
        AppRoutingModule,

        // Angular
        CommonModule,
        HttpModule,
        BrowserAnimationsModule
    ],
    providers: [
        LoggerService,
        CustomerDataLookupRestService
    ],
    bootstrap: [AppComponent]
})

export class AppModule { }

customer-data-lookup-rest.service.ts

import { CustomerDataLookupRestServiceInterface } from '../model/customer-
data-lookup-rest.interface';
import { Observable } from 'rxjs/Rx';
import { CustomerDataLookup } from '../model/customer-data-lookup';
import { RestResponse } from '../../app/model/rest-response';
import { Http } from '@angular/http';
import { environment } from '../../environments/environment';
import { LoggerService } from '../../app/services/logger.service';
import { Injectable } from '@angular/core';

@Injectable()
export class CustomerDataLookupRestService implements CustomerDataLookupRestServiceInterface {

    constructor(private http: Http, private loggerService: LoggerService) { }

    updateCustomerDataLookup(customerDataLookup: CustomerDataLookup): Observable<RestResponse> {
        return this.http
        .put(`${environment.configurationRestApiUrl}/CustomerDataLookup/${customerDataLookup.id}`, JSON.stringify(customerDataLookup))
        .map(response => response.json() as RestResponse)
        .catch(this.loggerService.handleError);
    }

logger.service.ts

import { Log } from '../model/log';
import { Http } from '@angular/http';
import { BaseResult } from '../model/base-result';
import { environment } from '../../environments/environment';
import { Observable } from 'rxjs/Rx';
import { Injectable } from '@angular/core';

@Injectable()
    export class LoggerService {

    constructor(private http: Http) { }

    log(log: Log): Observable<BaseResult> {
        return this.http.post(`${environment.restApiUrl}/Log/`, JSON.stringify(log))
            .map(response => response.json() as BaseResult);
    }

    handleError(error: Response): Observable<string> {
        const errorMessage = 'TEST';

        const log = new Log('ERROR', errorMessage);

        this.http.post(`${environment.configurationRestApiUrl}/Log/`, JSON.stringify(log))
            .map(response => response.json() as BaseResult);

        return Observable.throw(errorMessage);
    }

}

【问题讨论】:

  • 简短回答 - 不是 DRY 但至少可以测试它是否有效,复制第一个组件中的 handlerrror 并删除登录服务注入。长答案,但会简短地说,重新组织你的组件和服务,创建一个新服务只是为了在里面调用 htttp 并在其他两个中删除
  • 尝试.catch(() =&gt; this.loggerService.handleError());... 与ecmascript/typescript如何解析本地函数范围有关...

标签: angular


【解决方案1】:

解决方案如 A. Tim 建议的那样。

.catch(this.loggerService.handleError); 替换为.catch((error) =&gt; this.loggerService.handleError(error)); 后,一切都按预期工作。

【讨论】:

    猜你喜欢
    • 2017-09-24
    • 1970-01-01
    • 2019-10-27
    • 2021-06-29
    • 2019-01-17
    • 1970-01-01
    • 2020-06-16
    • 2016-07-06
    • 1970-01-01
    相关资源
    最近更新 更多