2016-11-02 3 views
23

Wie kann ich Informationen von einem ReadableStream-Objekt erhalten?Daten von einem ReadableStream-Objekt abrufen?

Ich verwende die Fetch-API, und ich sehe das nicht aus der Dokumentation klar.

Der Textkörper wird als ReadableStream zurückgegeben und ich möchte einfach auf eine Eigenschaft in diesem Stream zugreifen. Unter Response in den Browser-Entwicklungstools scheint diese Information in Form eines Javascript-Objekts in Eigenschaften organisiert zu sein.

fetch('http://192.168.5.6:2000/api/car', obj) 
    .then((res) => { 
     if(res.status == 200) { 
      console.log("Success :" + res.statusText); //works just fine 
     } 
     else if(res.status == 400) { 
      console.log(JSON.stringify(res.body.json()); //res.body is undefined. 
     } 

     return res.json(); 
    }) 

Vielen Dank im Voraus.

+1

[Körper-API-Referenz] (https://developer.mozilla.org/en-US/docs/Web/API/Body) –

+0

@FrancescoPezzella Danke für die Antwort. Ich habe 'response.Body.json()' versucht, aber ich erhalte _italic_ TypeError: Kann die Eigenschaft 'json' von undefiniertem _italic_ nicht lesen. Liegt das daran, dass die bodyUsed-Eigenschaft ebenfalls auf false gesetzt ist? Allerdings kann ich diesen Körper auf der Registerkarte Antwort in Browser-Entwickler-Tools anzeigen. Es gibt eine Fehlermeldung, die ich gerne abrufen würde. – noob

+0

Ihr Problem bezieht sich also nur auf den Fehler 400 Bedingung? Was passiert, wenn Sie den Handler in 'console.log (res.json()) ändern;'? Sehen Sie die Daten, die Sie erwarten? –

Antwort

35

Um auf die Daten von ReadableStream zuzugreifen, müssen Sie eine der Konvertierungsmethoden aufrufen (Dokumente verfügbar here).

Als Beispiel:

fetch('https://jsonplaceholder.typicode.com/posts/1') 
    .then(function(response) { 
    // The response is a Response instance. 
    // You parse the data into a useable format using `.json()` 
    return response.json(); 
    }).then(function(data) { 
    // `data` is the parsed version of the JSON returned from the above endpoint. 
    console.log(data); // { "userId": 1, "id": 1, "title": "...", "body": "..." } 
    }); 

Hope this up klare Dinge hilft.

+0

Danke für die Antwort. Ich habe das versucht und bekomme immer noch den gleichen Fehler, wenn res.body nicht definiert ist. Ich kann den Status jedoch in der ersten then() -Funktion mit res.status abrufen. Es scheint, dass nur der Körper ein ReadableStream-Objekt ist. Es scheint, eine Eigenschaft gesperrt zu haben, die auf wahr gesetzt ist? – noob

+0

Wo versuchen Sie auf 'res.body' zuzugreifen (das ist nicht Teil meines Beispiels)? Können Sie einen Beispielcode in Ihrer ursprünglichen Frage freigeben, um zu verdeutlichen, wo Ihr Problem liegt? –

+0

Ich versuchte den Zugriff auf res.body von der JSON-Antwort, die in der ersten .then() -Funktion zurückgegeben wurde. Ich habe meiner ursprünglichen Frage ein Muster hinzugefügt, um mehr Klarheit zu schaffen. Vielen Dank! – noob

9

res.json() gibt ein Versprechen. Versuchen ...

res.json().then(body => console.log(body)); 
+1

Ich habe das versucht, und es hat das Versprechen statt des Körpers ausgedruckt. – reectrix

10

Einige Leute nützlich, um ein async Beispiel finden können:

var response = await fetch("https://httpbin.org/ip"); 
var body = await response.json(); // .json() is asynchronous and therefore must be awaited 

json() wandelt die Reaktion des Körpers von einem ReadableStream auf ein JSON-Objekt.

Die await Anweisungen müssen in eine async Funktion verpackt werden, jedoch können Sie await Anweisungen direkt in der Konsole von Chrome ausführen (ab Version 62).

+4

Ideal zum Experimentieren an der Konsolen-Eingabeaufforderung. Weniger tippen. – Amitabh