我想通過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