Jak mogę uzyskać informacje z ReadableStream
obiektu?
Używam Fetch API i nie widzę tego w dokumentacji.
Ciało jest zwracane jako a ReadableStream
i chciałbym po prostu uzyskać dostęp do właściwości w tym strumieniu. W sekcji Response w narzędziach programistycznych przeglądarki wydaje mi się, że informacje te są uporządkowane we właściwościach 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();
})
javascript
node.js
reactjs
fetch
Nowicjusz
źródło
źródło
response.Body.json()
, ale otrzymuję kursywę TypeError: Nie można odczytać właściwości „json” niezdefiniowanej kursywy . Czy to dlatego, że właściwość bodyUsed jest również ustawiona na wartość false? Jednak mogę wyświetlić tę treść na karcie odpowiedzi w narzędziach programistycznych przeglądarki. Jest komunikat o błędzie, który chcę odzyskać.console.log(res.json());
? Czy widzisz oczekiwane dane?res.status == 200
?Odpowiedzi:
Aby uzyskać dostęp do danych z a
ReadableStream
, należy wywołać jedną z metod konwersji (dokumenty dostępne tutaj ).Jako przykład:
EDYCJA: Jeśli typ zwracanych danych nie jest JSON lub nie chcesz JSON, użyj
text()
Jako przykład:
Mam nadzieję, że to pomoże wyjaśnić sprawę.
źródło
res.body
(to nie jest część mojego przykładu)? Czy możesz udostępnić przykładowy kod w swoim pierwotnym pytaniu, aby wyjaśnić, gdzie może tkwić problem.Niektórym może
async
przydać się przykład:json()
konwertuje treść odpowiedzi z obiektu aReadableStream
na obiekt json.Te
await
oświadczenia muszą być opakowane wasync
funkcji, jednak można uruchomićawait
sprawozdań bezpośrednio w konsoli Chrome (od wersji 62).źródło
res.json()
zwraca obietnicę. Próbować ...źródło
.then
połączenia:fetch(...).then(res => res.json()).then(data => console.log(data))
Trochę późno na imprezę, ale miałem problemy z uzyskaniem czegoś użytecznego z
ReadableStream
wygenerowanego z żądania wsadowego Odata $ przy użyciu Sharepoint Framework.Miał podobne problemy jak OP, ale rozwiązaniem w moim przypadku było użycie innej metody konwersji niż
.json()
. W moim przypadku.text()
zadziałało jak urok. Konieczne były jednak pewne manipulacje, aby uzyskać przydatny kod JSON z pliku tekstowego.źródło
return $data;
. Wreszcie mogłem odczytać tę odpowiedź w przeglądarcefetch(...).then(response => response.text()).then(data => console.log(data));
Jeśli chcesz, aby odpowiedź była tylko tekstem i nie chcesz konwertować jej na JSON, użyj https://developer.mozilla.org/en-US/docs/Web/API/Body/text, a następnie
then
, aby uzyskać rzeczywisty wynik obietnicy:lub
źródło
Nie lubię wtedy łańcuchów. Drugi nie ma wtedy dostępu do statusu. Jak wspomniano wcześniej, „response.json ()” zwraca obietnicę. Zwrócenie wyniku „response.json ()” następnie w działaniu podobnym do sekundy to. Ma dodatkową zaletę, że znajduje się w zakresie odpowiedzi.
źródło
then
pomaga odzyskać ostateczną rozstrzygniętą wartość (thebody
). Zagnieżdżanie ich zapobiega uzyskaniubody
wartości bez wywołania zwrotnego lub jakiegoś mechanizmu tego rodzaju. Wyobraź sobie:let body = await fetch(...).then(res => res.json()).then(data => data)
. To nie zadziała w zagnieżdżony sposób. Aby to sprawdzićresponse.status
, zawsze możesz dodaćthrow
wyjątek w pierwszymthen
i dodaćcatch
do całego łańcucha obietnic.Pamiętaj, że strumień można odczytać tylko raz, więc w niektórych przypadkach może być konieczne sklonowanie odpowiedzi w celu wielokrotnego czytania:
źródło