我想通过REST与角2 HttpClient获取数据。我正在关注角色教程https://angular.io/tutorial/toh-pt6和英雄和HTTP部分,您将看到用于通过http获取英雄数据的代码片段。属性'json'不存在类型'对象'
getHeroes(): Promise<Hero[]> {
return this.http.get(this.heroesUrl)
.toPromise()
.then(response => response.json().data as Hero[])
.catch(this.handleError);
}
其下方是类似的版本我在我的应用程序
fetch(startIndex: number, limit: number): Promise<Order[]> {
let url = this.baseUrl + "&startIndex=" + startIndex + "&limit=" + limit;
return this.http.get(url)
.toPromise()
.then(response => response.json().results as Order[])
.catch(this.handleError);
}
写我使用InteliJ理念并有在电话会议上response.json(红色线),甚至当我尝试使用ng build生成错误。
属性'json'在类型'Object'上不存在。
您可能会注意到,而不是json().data
我有json().results
。这是因为根据教程,服务器使用具有data
字段的对象进行响应,但我自己的服务器使用具有results
字段的对象进行响应。如果你向下滚动教程,你会看到这一点。
请注意服务器返回的数据的形状。这个特定的 内存中的Web API示例返回一个具有data属性的对象。您的 API可能会返回其他内容。调整代码以匹配您的网络 API。
在试图解决这个问题,我想是这样的
(response: Response) => response.json().results as Order[]
当我做的是,以.json()方法得到了解决,但另一个错误弹出该
属性结果不存在类型Promise
我试图通过定义一个接口
interface OrderResponse {
orders: Order[];
}
并修改了get调用到
.get<OrderResponse>(url)...
但也没有工作。弹出另一个错误
类型'OrderResponse'不可分配给'Response'类型。
有一点值得注意的是,在本教程中他们使用了角的HttpModule,但在我的应用我用新的角度HttpClientModule所以也许这就是错误的到来。
我是Angular 2的新手,这是我用它创建的第一个应用程序。如果上面的代码不再适用于新的HttpClientModule,我将不胜感激任何有关如何实现与新的HttpClientModule相同的帮助。
我发现了类似的问题Property 'json' does not exist on type '{}'和Property does not exist on type 'object'但没有任何答案帮助我。
更新
正如评论认为存在一种新HttpClientModule无以.json()方法。我仍然希望能够帮助您获得与新模块相同的效果。从引导他们做了这样的事情
http.get<ItemsResponse>('/api/items').subscribe(data => {
// data is now an instance of type ItemsResponse, so you can do this:
this.results = data.results;
});
这一点我完全理解,但我的问题是,该代码是不是一个组件内,但一个服务调用订阅和结果分配给一个实例字段不会太大感。
我需要我的服务返回包裹在Promise中的Orders数组。我的组件可以直接拨打电话一样
this.orderService.fetch(0, 10).then(orders => this.orders = orders)
我还以为我的服务声明一个局部变量取方法,这样我可以做
.subscribe(data => {
this.orders = data.results;
}
// and out of the get call I return my local variable orders like
return Promise.resolve(orders)
但是,这没有多大意义的,我因为对.get()的调用是异步的,即使在所有数据都被提取并且orders数组可能为空之前,该方法可能会返回。
更新
如这里要求是对的HandleError
private handleError(error: any): Promise<any> {
console.log('An error occured ', error);
return Promise.reject(error.message || error);
}
HttpClient API中没有.json()方法。您正在关注的教程使用旧的Http API。请查看https://angular.io/guide/http –
就像@ Jota.Toledo说的那样,有两个http客户端--Http和HttpClient。 HttpClient是新的,不再使用.json()方法。 – matmo
@matmo感谢您的输入。我更新了我的问题。请看一看。谢谢 – ivange94