Eigenschaft 'json' existiert nicht beim Typ 'Objekt'

9

Ich versuche, Daten über REST mit angular 2 HttpClient zu holen. Ich folge dem eckigen Tutorial hier Ссылка und im Abschnitt Heroes and HTTP Sehen Sie sich diesen Codeschnipsel an, der zum Abrufen von Held-Daten über http verwendet wird.

%Vor%

Und unten ist eine ähnliche Version, die ich in meiner Anwendung geschrieben habe

%Vor%

Ich benutze InteliJ Idea und es gibt eine rote Linie auf dem Aufruf response.json () und selbst wenn ich versuche, mit ng build zu bauen, bekomme ich den Fehler.

  

Die Eigenschaft 'json' existiert nicht für den Typ 'Objekt'.

Sie werden feststellen, dass json().data statt json().results steht. Das ist so, weil der Server laut dem Tutorial mit einem Objekt reagiert hat, das ein data -Feld hat, aber mein eigener Server antwortet mit einem Objekt, das ein results -Feld hat. Wenn Sie das Tutorial ein wenig nach unten scrollen, sehen Sie diesen Punkt.

  

Beachten Sie die Form der Daten, die der Server zurückgibt. Diese besondere   In-Memory-Web-API-Beispiel gibt ein Objekt mit einer Dateneigenschaft zurück. Ihre   Die API könnte etwas anderes zurückgeben. Passen Sie den Code an Ihr Web an   API.

Um dies zu beheben, habe ich so etwas versucht

%Vor%

Als ich das gemacht habe, wurde die .json () Methode aufgelöst, aber ein weiterer Fehler tauchte auf,

  

Eigenschaftenresultate gibt es nicht für Typ Promise

Ich habe versucht, das zu beheben, indem ich eine Schnittstelle definiere

%Vor%

Und den Aufruf von

geändert %Vor%

Aber das hat auch nicht funktioniert. Ein weiterer Fehler tauchte auf

  

Geben Sie 'OrderResponse' nicht dem Typ 'Response' zu.

Eine Sache ist, dass sie im Tutorial das Angular HttpModule verwendet haben, aber in meiner Anwendung verwende ich das neue Angular HttpClientModule, also kommt vielleicht der Fehler.

Ich bin neu in Angular 2 und das ist die erste App, die ich damit baue. Wenn der obige Code mit dem neuen HttpClientModule nicht mehr gültig ist, würde ich mich über jede Hilfe freuen, wie Sie dasselbe mit dem neuen HttpClientModule erreichen können.

Ich habe ähnliche Fragen gefunden Die Eigenschaft 'json' existiert nicht für den Typ '{}' und Eigenschaft existiert nicht beim Typ 'Objekt' aber keine der Antworten dort half mir.

Aktualisieren

Wie in den Kommentaren vorgeschlagen, gibt es keine .json () -Methode im neuen HttpClientModule. Ich würde immer noch die Hilfe schätzen, wie man mit dem neuen Modul den gleichen Effekt erzielen kann. Von der Anleitung haben sie so etwas gemacht.

%Vor%

Das verstehe ich perfekt, aber mein Problem ist, dass Code nicht innerhalb einer Komponente ist, sondern ein Service, so dass das Aufrufen von subscribe und das Zuweisen des Ergebnisses zu einem Instanzfeld nicht viel Sinn ergibt.

Ich brauche meinen Dienst, um eine Reihe von Orders zurückzugeben, die in einem Versprechen enthalten sind. Die my-Komponenten können nur Anrufe wie

machen %Vor%

Ich dachte auch darüber nach, eine lokale Variable in meiner Service-Fetch-Methode zu deklarieren, so dass ich

machen kann %Vor%

Aber das macht für mich keinen Sinn, da der Aufruf von .get () asynchron ist und die Methode möglicherweise zurückkehrt, bevor alle Daten abgerufen wurden und das Array orders leer sein kann.

Aktualisieren

Wie hier gefordert, ist der Code für handleError

%Vor%     
ivange94 01.09.2017, 17:38
quelle

2 Antworten

2

Angenommen, dass Ihr Backend etwas wie folgt zurückgibt:

%Vor%

UPDATE: Jetzt gibt das Backend {results: [{},{}]}

zurück

im JSON-Format, wobei jedes {} ein serialisiertes Objekt ist, benötigen Sie Folgendes:

%Vor%

Ich habe den Catch-Abschnitt entfernt, da dieser über einen HTTP-Interceptor archiviert werden könnte. Überprüfen Sie die Dokumentation . Als Beispiel:

Ссылка

Und um es zu konsumieren, muss man es einfach wie folgt nennen:

%Vor%     
Jota.Toledo 01.09.2017, 18:07
quelle
37

Für zukünftige Besucher : In der neuen HttpClient (Angular 4.3+) co_de% object ist standardmäßig JSON, so dass Sie response nicht mehr benötigen. Verwenden Sie einfach response.json().data direkt.

Beispiel (geändert aus der offiziellen Dokumentation):

%Vor%

Vergessen Sie nicht, es zu importieren und das Modul unter Importe in die app.module.ts Ihres Projekts aufzunehmen:

%Vor%     
Voicu 21.12.2017 02:24
quelle