Bagaimana saya bisa mendapatkan informasi dari suatu ReadableStream
objek?
Saya menggunakan API Ambil dan saya tidak melihat ini jelas dari dokumentasi.
Tubuh sedang dikembalikan sebagai a ReadableStream
dan saya hanya ingin mengakses properti dalam aliran ini. Di bawah Respons di alat pengembang peramban, saya sepertinya mengatur informasi ini ke dalam properti, dalam bentuk objek 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
cupu
sumber
sumber
response.Body.json()
, tetapi saya mendapatkan italic TypeError: Tidak dapat membaca properti 'json' dari italic yang tidak terdefinisi . Apakah ini karena properti bodyUsed juga disetel ke false? Namun saya dapat melihat badan ini di bawah tab respons di alat pengembang browser. Ada pesan kesalahan yang ingin saya ambil.console.log(res.json());
? Apakah Anda melihat data yang Anda harapkan?res.status == 200
?Jawaban:
Untuk mengakses data dari
ReadableStream
Anda harus memanggil salah satu metode konversi (dokumen tersedia di sini ).Sebagai contoh:
EDIT: Jika tipe pengembalian data Anda bukan JSON atau Anda tidak ingin JSON, gunakan
text()
Sebagai contoh:
Semoga ini bisa membantu membereskan semuanya.
sumber
res.body
(ini bukan bagian dari contoh saya)? Bisakah Anda membagikan beberapa kode sampel dalam pertanyaan awal Anda untuk membuatnya lebih jelas di mana masalah Anda mungkin.Beberapa orang mungkin menemukan
async
contoh yang bermanfaat:json()
mengubah tubuh respons dari objekReadableStream
ke objek json.The
await
pernyataan harus dibungkus dalam sebuahasync
fungsi, namun Anda dapat menjalankanawait
pernyataan langsung di konsol Chrome (sebagai versi 62).sumber
res.json()
mengembalikan janji. Coba ...sumber
.then
panggilan:fetch(...).then(res => res.json()).then(data => console.log(data))
Sedikit terlambat ke pesta tetapi memiliki beberapa masalah dengan mengeluarkan sesuatu yang bermanfaat dari a
ReadableStream
dihasilkan dari permintaan $ batch Odata menggunakan Sharepoint Framework.Punya masalah serupa dengan OP, tetapi solusi dalam kasus saya adalah menggunakan metode konversi yang berbeda dari
.json()
. Dalam kasus saya.text()
bekerja seperti pesona. Namun beberapa biola diperlukan untuk mendapatkan JSON yang berguna dari filefile.sumber
return $data;
. Saya akhirnya bisa membaca respons ini di browser denganfetch(...).then(response => response.text()).then(data => console.log(data));
Jika Anda hanya ingin respons sebagai teks dan tidak ingin mengubahnya menjadi JSON, gunakan https://developer.mozilla.org/en-US/docs/Web/API/Body/text dan kemudian
then
untuk mendapatkan yang sebenarnya hasil dari janji:atau
sumber
Saya tidak suka chaining thens. Yang kedua kemudian tidak memiliki akses ke status. Seperti yang dinyatakan sebelumnya 'response.json ()' mengembalikan janji. Mengembalikan hasil kemudian dari 'response.json ()' dalam tindakan yang mirip dengan yang kedua itu. Ini memiliki bonus tambahan berada dalam ruang lingkup respons.
sumber
then
membantu Anda mengambil nilai akhir yang diselesaikan (thebody
). Bersarang mereka mencegah Anda mendapatkanbody
nilai tanpa panggilan balik atau mekanisme semacam itu. Bayangkan ini:let body = await fetch(...).then(res => res.json()).then(data => data)
. Ini tidak akan bekerja dengan cara bersarang. Untuk memeriksaresponse.status
Anda selalu bisathrow
pengecualian di dalam yang pertamathen
, dan menambahkancatch
rantai keseluruhan janji.Perhatikan bahwa Anda hanya dapat membaca streaming sekali, jadi dalam beberapa kasus, Anda mungkin perlu mengkloning respons agar dapat membacanya berulang kali:
sumber