簡體   English   中英

拒絕獲取承諾:訪問回復文本

[英]Rejected Fetch Promise: access to response text

我正在使用Fetch API加載一些JSON。 因此,我使用.json()上響應流,並且還可選的第二函數參數( onRejected )中.then()它只有一個參數,該拒絕原因。

如果出現問題(例如響應不是有效的JSON),我希望訪問原始響應文本以獲取有意義的錯誤日志或進一步處理意外的響應。

請考慮以下簡化代碼段:

fetch('api.php')
.then(
    response => { return response.json(); }
)
.then(
    json => { /* useful fulfillment value, a JSON object */ },
    reason => { /* string message only */ }
);

如果API響應時使用的不是有效JSON,則它會由於以下原因而拒絕:

SyntaxError:JSON.parse:JSON數據的第1行第1列出現意外字符

盡管這是一條非常清晰的錯誤消息,但它缺少真正導致錯誤的原因的轉儲。

我考慮過使用.text() ,然后嘗試自己解析JSON,但這在某種程度上違背.json()的目的。

如果流讀取被拒絕,是否有合理的方法來訪問響應文本?

您可以檢查內容類型:

  var contentType = response.headers.get("content-type");
  if(contentType && contentType.indexOf("application/json") !== -1) {
       response => { return response.json(); }
  }
  else{
       response => { return response.text(); }
  }

如果要在拒絕回調中獲取響應,可以執行以下操作

  response => { 
          var text = '';
          try{
              text= response.json(); 
          }
          catch (e if e instanceof SyntaxError) {
             text = response.text();
          } 
          return text;
  }

可以說這很討厭,但可以解決問題:

let res;
fetch('api.php')
.then(
    response => { res = response; return response.json(); }
)
.then(
    json => { /* useful fulfillment value, a JSON object */ },
    reason => { /* use res variable */ }
);

如果響應肯定具有主體,則使用response.text()方法(如其他答案或其他地方所示: MDNGoogle Web )讀取文本,然后在任何其他條件或檢查之前或之后自行解析(是否JSON?檢查然后使用JSON.parse)。

使用身體不是通常用於處理錯誤的有效技術。 如果API不包含正文,格式錯誤或請求完全失敗,會發生什么情況? 而是查看response.statusText (例如“未找到”), response.status (例如404)和其他標頭。 否則,在獲取失敗的情況下,響應將是帶有error.messageerror.stackError對象。 如果您擁有API並需要更復雜/可預測的消息傳遞,請考慮添加自定義標頭(例如'special-message'),並使用if(response.headers) response.headers.get('special-message')類的內容進行檢索。

只有在這些其他場景不再具有可預測性的問題時,才可以與身體合作。 在任何流式傳輸完成之前,上述標頭也可用,以進一步簡化和改善響應性和響應處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM