我的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());
}
}
答案 0 :(得分:70)
HttpClient.get()
自动应用res.json()
并返回Observable<HttpResponse<string>>
。您不再需要自己调用此函数。
答案 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”功能)之前仍能成功执行。