Angular - res.json()不是函数

时间:2017-10-08 12:03:01

标签: angular

我的API服务存在问题。此服务连接到我的nodejs后端api。

错误说

ERROR TypeError: res.json is not a function

我在最近更新此服务后使用HTTPClient而不是Http时收到此错误。我得到这个响应因为我错过了旧的http与新?如果那样的情况是新的响应,我该如何使用它?

import { Injectable } from '@angular/core';
import { environment } from '../../environments/environment';
import { HttpHeaders, HttpClient, HttpParams } from '@angular/common/http';
import { Response } from '@angular/http';
import { Observable } from 'rxjs/Rx';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';

import { JwtService } from './jwt.service';

@Injectable()
export class ApiService {
  constructor(
    private http: HttpClient,
    private jwtService: JwtService
  ) {}

  private setHeaders(): HttpHeaders {
    const headersConfig = {
      'Content-Type': 'application/json',
      'Accept': 'application/json'
    };
    if (this.jwtService.getToken()) {
      headersConfig['Authorization'] = this.jwtService.getToken();
    }
    return new HttpHeaders(headersConfig);
  }

  private formatErrors(error: any) {
     return Observable.throw(error.json());
  }

  get(path: string, httpParams: HttpParams = new HttpParams()): Observable<any> {
    return this.http.get(`${environment.api_url}${path}`, { headers: this.setHeaders(), params: httpParams })
    .catch(this.formatErrors)
    .map((res: Response) => res.json());
  }

  put(path: string, body: Object = {}): Observable<any> {
    return this.http.put(
      `${environment.api_url}${path}`,
      JSON.stringify(body),
      { headers: this.setHeaders() }
    )
    .catch(this.formatErrors)
    .map((res: Response) => res.json());
  }

  post(path: string, body: Object = {}): Observable<any> {
    return this.http.post(
      `${environment.api_url}${path}`,
      body,
      { headers: this.setHeaders() }
    )
    .catch(this.formatErrors)
    .map((res: Response) => res.json());
  }

  delete(path): Observable<any> {
    return this.http.delete(
      `${environment.api_url}${path}`,
      { headers: this.setHeaders() }
    )
    .catch(this.formatErrors)
    .map((res: Response) => res.json());
  }
}

4 个答案:

答案 0 :(得分:70)

HttpClient.get()自动应用res.json()并返回Observable<HttpResponse<string>>。您不再需要自己调用此函数。

请参阅Difference between HTTP and HTTPClient in angular 4?

答案 1 :(得分:10)

您可以删除以下整行:

 .map((res: Response) => res.json());

根本不需要使用map方法。

答案 2 :(得分:7)

不要使用这种方法:

 .map((res: Response) => res.json() );

使用这种简单的方法代替以前的方法。希望你能得到你的结果:

.map(res => res );

答案 3 :(得分:0)

有一个类似的问题,我们想从Angular 7中的不赞成使用的Http模块更新为HttpClient。 但是应用程序很大,需要在很多地方更改res.json()。 所以我这样做是为了使新模块具有后支持。

return this.http.get(this.BASE_URL + url)
      .toPromise()
      .then(data=>{
        let res = {'results': JSON.stringify(data),
        'json': ()=>{return data;}
      };
       return res; 
      })
      .catch(error => {
        return Promise.reject(error);
      });

从中心位置添加一个虚拟的名为“ json”的函数,以便所有其他服务在更新它们以适应新的响应处理方式(即没有“ json”功能)之前仍能成功执行。