【问题标题】:Angular - res.json() is not a functionAngular - res.json() 不是函数
【发布时间】:2018-03-19 17:52:42
【问题描述】:

我的 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());
  }
}

【问题讨论】:

    标签: angular


    【解决方案1】:

    有一个类似的问题,我们想在 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”函数)之前仍然可以成功执行。

    【讨论】:

    • 谢谢!我有这个确切的问题,这对我有用。
    【解决方案2】:

    您可以删除下面的整行:

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

    根本不需要使用map方法。

    【讨论】:

      【解决方案3】:

      不需要使用这个方法:

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

      只需使用这个简单的方法,而不是以前的方法。希望你能得到你的结果:

      .map(res => res );
      

      【讨论】:

        【解决方案4】:

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

        Difference between HTTP and HTTPClient in angular 4?

        【讨论】:

        • 所以我可以删除整行.map((res: Response) =&gt; res.json()); ?
        • 如何从响应中获取标头?
        • 这似乎也适用于'Http.post(),这是有道理的。
        • 如果我还想调用它怎么办?我的意思是,我还需要原始响应
        • 最好,救命稻草,我从几个小时开始就搞砸了订阅和地图
        猜你喜欢
        • 2018-07-05
        • 2018-01-28
        • 2019-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-23
        相关资源
        最近更新 更多