2016-11-02 17 views
23

Jak mogę uzyskać informacje z obiektu ReadableStream?Pobieranie danych z obiektu ReadableStream?

Używam interfejsu API pobierania i nie widzę tego w dokumentacji.

Treść jest zwracana jako ReadableStream i chciałbym po prostu uzyskać dostęp do właściwości w ramach tego strumienia. W sekcji Odpowiedzi w narzędziach przeglądarki przeglądarki wydaje mi się, że te informacje są zorganizowane we właściwości w postaci obiektu JavaScript.

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(); 
    }) 

Z góry dziękuję.

+1

[Body API reference] (https://developer.mozilla.org/en-US/docs/Web/API/Body) –

+0

@FrancescoPezzella Dzięki za odpowiedź. Próbowałem 'response.Body.json()', ale otrzymuję _italic_ TypeError: Nie można odczytać właściwości 'json' niezdefiniowanego _italic_. Czy dzieje się tak, ponieważ właściwość bodyUsed jest również ustawiona na wartość false? Jednak mogę wyświetlić to ciało pod kartą odpowiedzi w narzędziach programistycznych przeglądarki. Jest komunikat o błędzie, który chciałbym pobrać. – noob

+0

Więc twój problem jest wyłącznie związany ze stanem błędu 400? Co się stanie, jeśli zmienisz program obsługi na 'console.log (res.json());'? Czy widzisz dane, których się spodziewasz? –

Odpowiedz

35

Aby uzyskać dostęp do danych z numeru ReadableStream, należy wywołać jedną z metod konwersji (dostępne dokumenty: here).

Jako przykład:

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": "..." } 
    }); 

Nadzieja pomaga to jasne rzeczy.

+0

Dzięki za odpowiedź. Próbowałem tego i nadal otrzymuję ten sam błąd, gdy res.body jest niezdefiniowany. Jednak jestem w stanie odzyskać status w pierwszej funkcji then() z res.status. Wygląda na to, że tylko ciało jest obiektem ReadableStream. Wygląda na to, że ma ona właściwość zablokowaną, która jest ustawiona na true? – noob

+0

Gdzie próbujesz uzyskać dostęp do 'res.body' (to nie jest część mojego przykładu)? Czy możesz podzielić się przykładowym kodem w pierwotnym pytaniu, aby wyjaśnić, gdzie może być problem. –

+0

Próbowałem uzyskać dostęp do res.body z odpowiedzi json, która została zwrócona w pierwszej funkcji .then(). Dodałem próbkę do mojego pierwotnego pytania dla większej jasności. Dzięki! – noob

9

res.json() zwraca obietnicę. Spróbuj ...

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

Próbowałem tego i wydrukowałem obietnicę zamiast ciała. – reectrix

10

Niektórzy ludzie mogą znaleźć async przykład użytecznej:

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

json() przekształca ciało Response z ReadableStream do obiektu JSON.

Instrukcje muszą być zapakowane w funkcję async, jednak można uruchamiać instrukcje await bezpośrednio w konsoli Chrome (od wersji 62).

+4

Doskonały do ​​eksperymentowania z podpowiedziami konsoli. Mniej pisania. – Amitabh

Powiązane problemy