ReadableStreamオブジェクトからデータを取得しますか?


135

ReadableStreamオブジェクトから情報を取得するにはどうすればよいですか?

私はFetch APIを使用していますが、ドキュメントからこれが明確であるとは思いません。

本文はとして返されReadableStreamます。このストリーム内のプロパティにアクセスしたいだけです。ブラウザー開発ツールの[応答]で、この情報が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();
    })


2
@FrancescoPezzellaご返信ありがとうございます。私は試しましたがresponse.Body.json()イタリック TypeError:未定義のイタリックのプロパティ 'json'を読み取ることができません。これは、bodyUsedプロパティもfalseに設定されているためですか?ただし、ブラウザー開発者ツールの応答タブの下でこの本文を表示できます。取得したいエラーメッセージがあります。
noob

あなたの問題は純粋にエラー400の状態に関連していますか?ハンドラーをに変更するとどうなりますconsole.log(res.json());か?期待しているデータが表示されていますか?
アシュリー 'CptLemming'ウィルソン

@noob応答をストリームとして読み取ろうとしていますかres.status == 200
guest271314 2016

それはちょうど私やドキュメントがあるということである平野間違っていますか?私はこの答えの解決策でそれを修正しました。
Lucio、

回答:


177

からデータにアクセスするにReadableStreamは、いずれかの変換メソッドを呼び出す必要があります(ドキュメントはこちらから入手できます)。

例として:

fetch('https://jsonplaceholder.typicode.com/posts/1')
  .then(function(response) {
    // The response is a Response instance.
    // You parse the data into a useable format using `.json()`
    return response.json();
  }).then(function(data) {
    // `data` is the parsed version of the JSON returned from the above endpoint.
    console.log(data);  // { "userId": 1, "id": 1, "title": "...", "body": "..." }
  });

編集:データの戻り値の型がJSONでない場合、またはJSONが不要な場合は、text()

例として:

fetch('https://jsonplaceholder.typicode.com/posts/1')
  .then(function(response) {
    return response.text();
  }).then(function(data) {
    console.log(data); // this will be a string
  });

これが物事を明確にするのに役立つことを願っています。


1
ご返信ありがとうございます。私はこれを試しましたが、res.bodyが未定義の場合と同じエラーが発生します。ただし、最初にthen()関数でres.statusを使用してステータスを取得できます。本文のみがReadableStreamオブジェクトのようです。trueに設定されているプロパティがロックされているようです。
noob

どこにアクセスしようとしているのですかres.body(これは私の例の一部ではありません)?問題がどこにあるかを明確にするために、元の質問のサンプルコードを共有できますか?
アシュリー 'CptLemming'ウィルソン

1
最初の.then()関数で返されたjson応答からres.bodyにアクセスしてみました。より明確にするために、元の質問にサンプルを追加しました。ありがとう!
noob 2016年

1
素晴らしく、reactとrequestネイティブを使用しており、ReadableStreamを使って何をすべきかを世界中で疑問に思っていました。++
エデンコルビン2017

ただの支度は簡単に思えますが、ヒットしているバックエンドが実際に有効なJSONを提供していることを確認してください!確かに経験から話していない。
アベリト

44

一部の人々は、async例が役に立つと思うかもしれません:

var response = await fetch("https://httpbin.org/ip");
var body = await response.json(); // .json() is asynchronous and therefore must be awaited

json()応答の本文をa ReadableStreamからjsonオブジェクトに変換します。

awaitステートメントは、に包まれなければなりませんasyncが、あなたが実行することができ、機能await(バージョン62のような)クロームのコンソールに直接文を。


1
時々、あなたのための本当の答えは本当に#2笑である、それが彼らが.json()を非同期にする理由は理にかなっているが、すぐには明らかではなかった
Sanchit Batra

29

res.json()約束を返します。試してみてください...

res.json().then(body => console.log(body));

3
これを試してみたところ、本体ではなく約束が印刷されていました。
reectrix

.then通話をfetch(...).then(res => res.json()).then(data => console.log(data))
つなげ

12

パーティーに少し遅れたが、何かから有用なものを得ることにいくつかの問題があった ReadableStream、Sharepoint Frameworkを使用してOdata $ batchリクエストから生成された。

OPと同様の問題がありましたが、私の場合の解決策はとは異なる変換方法を使用すること.json()でした。私の場合.text()、魅力のように働きました。ただし、テキストファイルからいくつかの便利なJSONを取得するには、いじくり回す必要がありました。


2
ありがとうございました!これでうまくいきました。LaravelサーバーからIlluminate http応答を送信しますreturn $data;。私はついにブラウザでこの応答を読むことができましたfetch(...).then(response => response.text()).then(data => console.log(data));
Cameron Hudson

10

あなただけのテキストとして応答をしたいとJSONに変換したくない、使用している場合https://developer.mozilla.org/en-US/docs/Web/API/Body/textをして、thenそれが実際に取得するには約束の結果:

fetch('city-market.md')
  .then(function(response) {
    response.text().then((s) => console.log(s));
  });

または

fetch('city-market.md')
  .then(function(response) {
    return response.text();
  })
  .then(function(myText) {
    console.log(myText);
  });

2

私はその時の連鎖が嫌いです。次に、2番目はステータスにアクセスできません。前述のように、「response.json()」はプロミスを返します。「response.json()」のthen結果を、2番目のthenと同様の動作で返します。応答の範囲内にあるという追加のボーナスがあります。

return fetch(url, params).then(response => {
    return response.json().then(body => {
        if (response.status === 200) {
            return body
        } else {
            throw body
        }
    })
})

チェーンthenは、最終的に解決された値(body)を取得するのに役立ちます。それらをネストするとbody、コールバックやソートのメカニズムがなければ、値を取得できなくなります。これを想像してみてくださいlet body = await fetch(...).then(res => res.json()).then(data => data)。これはネストされた方法では機能しません。確認するresponse.statusにはthrow、最初の内で常に例外を確認し、プロミスチェーン全体にthenを追加しcatchます。
オスカーゴメスアルカニス

0

ストリームを一度しか読み取ることができないことに注意してください。そのため、場合によっては、繰り返し読み取るために応答を複製する必要があるかもしれません。

fetch('example.json')
  .then(res=>res.clone().json())
  .then( json => console.log(json))

fetch('url_that_returns_text')
  .then(res=>res.clone().text())
  .then( text => console.log(text))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.