¿Cómo puedo obtener información de un ReadableStream
objeto?
Estoy usando la API Fetch y no veo que esto esté claro en la documentación.
El cuerpo se devuelve como ReadableStream
ay simplemente me gustaría acceder a una propiedad dentro de esta secuencia. En Respuesta en las herramientas de desarrollo del navegador, parece que tengo esta información organizada en propiedades, en forma de un objeto 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
novato
fuente
fuente
response.Body.json()
, pero me está apareciendo TypeError en cursiva : no se puede leer la propiedad 'json' de cursiva indefinida . ¿Es esto porque la propiedad bodyUsed también se establece en falso? Sin embargo, puedo ver este cuerpo en la pestaña de respuesta en las herramientas de desarrollo del navegador. Hay un mensaje de error que me gustaría recuperar.console.log(res.json());
? ¿Ves los datos que esperas?res.status == 200
?Respuestas:
Para acceder a los datos desde un
ReadableStream
debe llamar a uno de los métodos de conversión (documentos disponibles aquí ).Como ejemplo:
EDITAR: si su tipo de retorno de datos no es JSON o no desea JSON, use
text()
Como ejemplo:
Espero que esto ayude a aclarar las cosas.
fuente
res.body
(esto no es parte de mi ejemplo)? ¿Puede compartir algún código de muestra en su pregunta original para aclarar dónde podría estar su problema?Algunas personas pueden encontrar un
async
ejemplo útil:json()
convierte el cuerpo de la respuesta deReadableStream
a en un objeto json.Las
await
declaraciones deben estar envueltas en unaasync
función, sin embargo, puede ejecutarlasawait
directamente en la consola de Chrome (a partir de la versión 62).fuente
res.json()
devuelve una promesa Tratar ...fuente
.then
llamadas:fetch(...).then(res => res.json()).then(data => console.log(data))
Un poco tarde para la fiesta, pero tuve algunos problemas para obtener algo útil de un
ReadableStream
Llegó un solicitud producida a partir de un lote de Odata $ usando el Marco de Sharepoint.Tuve problemas similares a los de OP, pero la solución en mi caso fue usar un método de conversión diferente que
.json()
. En mi caso.text()
funcionó a las mil maravillas. Sin embargo, fue necesario jugar un poco para obtener algunos JSON útiles del archivo de texto.fuente
return $data;
. Finalmente pude leer esta respuesta en el navegador confetch(...).then(response => response.text()).then(data => console.log(data));
Si solo desea la respuesta como texto y no desea convertirla en JSON, use https://developer.mozilla.org/en-US/docs/Web/API/Body/text y luego
then
para obtener la respuesta real resultado de la promesa:o
fuente
No me gustan los encadenamientos. El segundo entonces no tiene acceso al estado. Como se indicó antes, 'response.json ()' devuelve una promesa. Devolver el resultado de 'response.json ()' en un acto similar a un segundo entonces. Tiene la ventaja adicional de estar dentro del alcance de la respuesta.
fuente
then
ayuda a recuperar el valor final resuelto (elbody
). Anidarlos evita que pueda obtener elbody
valor sin una devolución de llamada o algún mecanismo de este tipo. Imagínese esto:let body = await fetch(...).then(res => res.json()).then(data => data)
. Esto no funcionaría de la manera anidada. Para verificarloresponse.status
, siempre puede hacerthrow
una excepción dentro de la primerathen
y agregar unacatch
a toda la cadena de promesa.Tenga en cuenta que solo puede leer una secuencia una vez, por lo que en algunos casos, es posible que deba clonar la respuesta para leerla repetidamente:
fuente