Como posso obter informações de um ReadableStream
objeto?
Estou usando a API de busca e não vejo isso claro na documentação.
O corpo está sendo retornado como ReadableStream
e eu simplesmente gostaria de acessar uma propriedade dentro desse fluxo. Em Resposta nas ferramentas de desenvolvimento do navegador, parece que essas informações estão organizadas em propriedades, na forma de um 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
fonte
fonte
response.Body.json()
, mas estou recebendo itálico TypeError: Não é possível ler a propriedade 'json' de itálico indefinido . Isso ocorre porque a propriedade bodyUsed também está definida como false? No entanto, eu posso ver esse corpo na guia resposta nas ferramentas de desenvolvedor do navegador. Há uma mensagem de erro que eu gostaria de recuperar.console.log(res.json());
? Você vê os dados que está esperando?res.status == 200
?Respostas:
Para acessar os dados de um,
ReadableStream
é necessário chamar um dos métodos de conversão (documentos disponíveis aqui ).Como um exemplo:
EDIT: Se o seu tipo de retorno de dados não é JSON ou você não deseja JSON, use
text()
Como um exemplo:
Espero que isso ajude a esclarecer as coisas.
fonte
res.body
(isso não faz parte do meu exemplo)? Você pode compartilhar algum código de exemplo na sua pergunta original para deixar mais claro onde pode estar o seu problema.Algumas pessoas podem achar um
async
exemplo útil:json()
converte o corpo da resposta de umReadableStream
objeto json.As
await
instruções devem ser agrupadas em umaasync
função, no entanto, você pode executarawait
instruções diretamente no console do Chrome (a partir da versão 62).fonte
res.json()
retorna uma promessa. Experimentar ...fonte
.then
chamadas:fetch(...).then(res => res.json()).then(data => console.log(data))
Um pouco atrasado para a festa, mas teve alguns problemas para obter algo útil de um
ReadableStream
solicitação de lote produzida em Odata $ usando o Sharepoint Framework.Teve problemas semelhantes aos do OP, mas a solução no meu caso foi usar um método de conversão diferente do que
.json()
. No meu caso,.text()
funcionou como um encanto. No entanto, foi necessário algum trabalho para obter JSON útil do arquivo de texto.fonte
return $data;
. Eu estava finalmente capaz de ler esta resposta no navegador comfetch(...).then(response => response.text()).then(data => console.log(data));
Se você deseja apenas a resposta como texto e não deseja convertê-la em JSON, use https://developer.mozilla.org/en-US/docs/Web/API/Body/text e, em seguida
then
, obtenha a resposta real resultado da promessa:ou
fonte
Não gosto do encadeamento de três. O segundo, então, não tem acesso ao status. Como afirmado anteriormente, 'response.json ()' retorna uma promessa. Retornando o resultado then de 'response.json ()' em um ato semelhante a um segundo então. Tem o bônus adicional de estar no escopo da resposta.
fonte
then
ajuda a recuperar o valor final resolvido (thebody
). Aninhar eles impede que você seja capaz de obter obody
valor sem um retorno de chamada ou algum mecanismo do tipo. Imagine o seguinte:let body = await fetch(...).then(res => res.json()).then(data => data)
. Isso não funcionaria da maneira aninhada. Para verificar se háresponse.status
semprethrow
uma exceção dentro da primeirathen
e adicione umacatch
a toda a cadeia de promessas.Observe que você só pode ler um fluxo uma vez; portanto, em alguns casos, pode ser necessário clonar a resposta para lê-la repetidamente:
fonte