2016-11-02 69 views
23

如何從ReadableStream對象獲取信息?從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(); 
    }) 

在此先感謝。

+1

[Body API參考](https://developer.mozilla.org/en-US/docs/Web/API/Body) –

+0

@FrancescoPezzella感謝您的回覆。我嘗試過'response.Body.json()',但我越來越_italic_ TypeError:無法讀取未定義_italic_的屬性'json'。 這是因爲bodyUsed屬性也設置爲false? 但是,我可以在瀏覽器開發人員工具的響應選項卡下查看此主體。有一個我想要檢索的錯誤消息。 – noob

+0

因此,您的問題純粹與錯誤400條件有關?如果將處理程序更改爲'console.log(res.json());會發生什麼?你看到你期待的數據嗎? –

回答

35

爲了訪問ReadableStream中的數據,您需要調用其中一種轉換方法(文檔可用here)。

舉個例子:

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": "..." } 
    }); 

希望這有助於清楚的事情了。

+0

感謝您的回覆。我已經嘗試過這一點,並且仍然遇到res.body未定義的錯誤。我可以通過res.status在first()函數中檢索狀態。看來只有body是一個ReadableStream對象。它似乎鎖定了一個屬性,該屬性設置爲true? – noob

+0

你在哪裏試圖訪問'res.body'(這不是我的例子的一部分)?你可以在你的原始問題中分享一些示例代碼,以便在問題出現的地方更清楚地說明問題。 –

+0

我試着從第一個.then()函數返回的json響應中訪問res.body。爲了更加清晰,我在原始問題中添加了一個示例。謝謝! – noob

9

res.json()返回承諾。試試...

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

我試過了,打印出Promise而不是正文。 – reectrix

10

有些人可能會發現一個async例如有用:

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

json()響應的身體從ReadableStream轉換成JSON對象。

await語句必須封裝在async函數中,但是您可以直接在Chrome的控制檯(從版本62開始)運行await語句。

+4

非常適合在控制檯提示符下進行試驗。減少打字。 – Amitabh