簡體   English   中英

是4xx和5xx.network錯誤嗎?

[英]Is 4xx and 5xx network errors?

我有一個節點服務器,它基本上從特定路徑讀取組件,執行代碼,並將數據返回給其他服務器。

有時在組件的代碼執行期間,我會收到 403 響應。

錯誤:

ApolloError: Response not successful: Received status code 403

我正在使用.catch()來捕獲 403 響應,但它無濟於事,並且由於 403 經常導致 pod 崩潰。

我已經檢查了這個 StackOverflow 答案 - Fetch: reject promise and catch the error if status is not OK?

它提到

由於 4xx 和 5xx 響應不是網絡錯誤,因此沒有什么可捕獲的

這樣對嗎?

如果上面的說法成立,是否可以像下面這樣處理:

app.use((req,res) => {
   res.status(403).send('');
})

是4xx和5xx.network錯誤嗎?

不,它們是 HTTP 錯誤響應,已通過 .network 從服務器成功傳輸到客戶端。

我正在使用.catch() 來捕捉 403 響應

鑒於您鏈接到的問題,我假設您的意思是fetch 這是使用fetch API 的常見問題( 我認為是 footgun) fetch僅拒絕其 promise on network errors ,而不是 HTTP 錯誤。 因此,如果無法聯系服務器,它將拒絕其 promise。 如果它成功聯系服務器並收到 HTTP 錯誤響應,則不會

您鏈接的問題的答案(例如這個)和我上面鏈接的博客文章描述了如何使用.network 和 HTTP 錯誤的公共路徑來處理這個問題:當您第一次獲得Response object 時,檢查其ok屬性並拋出 if這不是真的,然后在一個常見的拒絕處理程序中處理拒絕。

但重申以防這些資源消失(不太可能,但答案應該是獨立的),以 JSON 為例,我通常會在我的項目代碼庫中有這樣的東西:

async function fetchJSON(...args) {
    const response = await fetch(...args);
    if (!response.ok) {
        // Network was fine, but there was an HTTP error
        throw new Error(`HTTP error ${response.status}`);
    }
    return await response.json();
}

我這樣做是因為在絕大多數情況下,執行fetch代碼並不關心是否存在網絡錯誤或 HTTP 錯誤,它只關心提取(以及相關的 JSON 解析)是否執行或沒用。

暫無
暫無

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

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