Comment puis-je obtenir des informations sur un ReadableStream
objet?
J'utilise l'API Fetch et je ne vois pas cela clairement dans la documentation.
Le corps est renvoyé en tant que ReadableStream
et je voudrais simplement accéder à une propriété dans ce flux. Sous Réponse dans les outils de développement du navigateur, il semble que ces informations soient organisées en propriétés, sous la forme d'un objet 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();
})
response.Body.json()
, mais j'obtiens de l' italique TypeError: Impossible de lire la propriété 'json' de l' italique non défini . Est-ce parce que la propriété bodyUsed est également définie sur false? Cependant, je peux afficher ce corps sous l'onglet de réponse dans les outils de développement de navigateur. Il y a un message d'erreur que j'aimerais récupérer.console.log(res.json());
? Voyez-vous les données que vous attendez?res.status == 200
?Réponses:
Pour accéder aux données à partir d'un,
ReadableStream
vous devez appeler l'une des méthodes de conversion (documentation disponible ici ).Par exemple:
EDIT: Si votre type de retour de données n'est pas JSON ou si vous ne voulez pas JSON, utilisez
text()
Par exemple:
J'espère que cela aidera à clarifier les choses.
la source
res.body
(cela ne fait pas partie de mon exemple)? Pouvez-vous partager un exemple de code dans votre question d'origine pour préciser où se situe votre problème.Certaines personnes peuvent trouver un
async
exemple utile:json()
convertit le corps de la réponse de aReadableStream
en objet json.Les
await
instructions doivent être encapsulées dans uneasync
fonction, cependant vous pouvez exécuter desawait
instructions directement dans la console de Chrome (à partir de la version 62).la source
res.json()
renvoie une promesse. Essayez ...la source
.then
appels:fetch(...).then(res => res.json()).then(data => console.log(data))
Un peu tard à la fête, mais j'ai eu des problèmes pour obtenir quelque chose d'utile d'un
ReadableStream
j'ai d'une demande de lot Odata $ en utilisant le Framework Sharepoint.Avait des problèmes similaires à OP, mais la solution dans mon cas était d'utiliser une méthode de conversion différente de celle
.json()
. Dans mon cas, a.text()
fonctionné comme un charme. Quelques manipulations étaient cependant nécessaires pour obtenir du JSON utile à partir du fichier texte.la source
return $data;
. J'ai enfin pu lire cette réponse dans le navigateur avecfetch(...).then(response => response.text()).then(data => console.log(data));
Si vous voulez juste la réponse sous forme de texte et que vous ne voulez pas la convertir en JSON, utilisez https://developer.mozilla.org/en-US/docs/Web/API/Body/text et ensuite
then
pour obtenir le réel résultat de la promesse:ou
la source
Je n'aime pas l'enchaînement alors. Le second n'a alors pas accès au statut. Comme indiqué précédemment, 'response.json ()' renvoie une promesse. Renvoyer le résultat then de 'response.json ()' dans un acte similaire à un second alors. Il a l'avantage supplémentaire d'être dans le champ de la réponse.
la source
then
vous aide à récupérer la valeur résolue finale (lebody
). Les imbriquer vous empêche de pouvoir obtenir labody
valeur sans rappel ni mécanisme de ce type. Imaginez ceci:let body = await fetch(...).then(res => res.json()).then(data => data)
. Cela ne fonctionnerait pas de manière imbriquée. Pour vérifier,response.status
vous pouvez toujoursthrow
une exception à l'intérieur du premierthen
et ajouter uncatch
à toute la chaîne de promesse.Notez que vous ne pouvez lire un flux qu'une seule fois, donc dans certains cas, vous devrez peut-être cloner la réponse afin de la lire à plusieurs reprises:
la source