簡體   English   中英

如何使用JS提取正確處理400(或任何不成功的狀態代碼)

[英]How to properly handle a 400 (or any non-successful status codes) with JS fetch

我有一個API端點(恰好是Django Rest框架),通常會返回創建的響應狀態代碼201,但是如果未正確輸入字段,也會返回400錯誤。 我正在使用訪存來使用此API並返回json,如下所示:

export const myAPICall = (postValues) => {
    return fetch('/myapi/', someHeaders)
        .then(resp => {
            return resp.json();
        })
        .then(data => {
            return data
        }).catch(error => (error));
}

所有這些工作都很好,但是當然會出現400錯誤(從技術上講是有效的響應,不會引發錯誤),並且該錯誤中包含我想用來通知用戶的可解析的JSON。

錯誤的實際響應可能如下所示:

Response {type: "cors", url: "http://myapi/", redirected: false, status: 400, ok: false, …}

響應的正文包含有用的JSON。 當響應不正常時,我仍然想拋出一個錯誤,所以這是我最初所做的:

export const myAPICall = (postValues) => {
    return fetch('/myapi/', someHeaders)
        .then(resp => {
            if (!resp.ok) {
                throw resp;
            }
            return resp.json();
        })
        .then(data => {
            return data
        }).catch(error => { throw error});
}

但是,我在為如何返回響應的JSON值以供以后使用而苦苦掙扎(在調用myAPICall()。then(..)。catch(error => {...}時要注意)

實際上,我什至不確定這是否是正確的方法。 因此,如果有人提出建議,而不僅僅是將其作為一個可行的例子,那將是非常受歡迎的。 可以肯定的是,如果這是實際錯誤,那么我不想在那么中返回“數據”,因為JSON對象的格式將完全不同。

非常感謝,

您可能想返回自己的Promise,並根據獲取的結果來解決/拒絕該諾言。 大概是這樣的:

export const myAPICall = (postValues) => {
  return new Promise((resolve, reject) => {
    fetch('/myapi/', someHeaders)
      .then(resp => {
        if (!resp.ok) {
          reject(resp);
        }
        else {
          resolve(resp);
        }
      })
      .catch(error => { reject(error) });
  });
}

myAPICall().then(result => console.log(result)).catch(err => console.log(err))

暫無
暫無

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

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