【问题标题】:Javascript Fetch returns 404 occasionallyJavascript Fetch 偶尔返回 404
【发布时间】:2022-03-15 23:33:42
【问题描述】:

我们发现我们的 .fetch 命令偶尔会返回 404。即使文件存在并且经常被命中,有时它也会收到 404。

window.fetch('/category/somepage', {
    credentials: 'same-origin',
    method: 'POST',
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(app.addAntiForgeryToken(postData))
  })
  .then(function(response) {
    if (response.ok) {
      return response.json();
    }
    throw new Error('Network response was not ok');
  })
  .then(result => {
    if (result.Status === 'OK') {
      //...
    }
  })

目前它正被throw new Error捕获。

由于我们需要解决此问题,在点击页面之前强制重试此问题的最佳方法是什么?我们应该显示一个重试按钮还是有办法循环这个?我不确定为什么这甚至会抛出 404,因为文件肯定一直存在。

【问题讨论】:

  • 一开始你是如何确定它实际上是 404 的?
  • 控制台显示404s
  • 您是否检查过服务器端以了解为什么会发生这种情况?也许这故意用 404 响应,表示没有找到给定搜索查询的结果(?)或类似的东西。
  • 是的,这确实很奇怪。这是我们刚刚点击的静态页面,我们知道它存在并且一直存在。只是有时它是404s。我们将调查服务器端,看看是否也有任何发现。

标签: javascript fetch-api


【解决方案1】:

这里的经典做法是重试操作,因为网络通信可能不可靠,尤其是在移动设备上。但是瞬态 404 是一个不同的问题,它指向可能需要单独诊断的 Web 服务器的问题。 (例如:如果它是一个充当单个端点的 Web 服务器集群,其中一个可能配置错误,因此找不到其他人可以找到的资源。)

但是对于暂时的失败,经典的事情是重试:

function fetchJSONWithRetry(input, init, retries = 10) {
    return fetch(input, init)
        .then(function(response) {
            if (response.ok) {
                return response.json();
            }
            throw new Error('Network response was not ok'); // I usually use `new Error("HTTP status " + response.status)`
        })
        .catch(error => {
            if (retries <= 0) {
                throw error;
            }
            return fetchJSONWithRetry(input, init, retries - 1);
        });
}

这样使用:

fetchJSONWithRetry('/category/somepage', {
    credentials: 'same-origin',
    method: 'POST',
    headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json'
    },
    body: JSON.stringify(app.addAntiForgeryToken(postData))
})
.then(result => {
    if (result.Status === 'OK') {
        // ...
    }
})
.catch(error => {
    // All retries failed, handle it
});

inputinitused by the spec 的名称 fetch,所以这就是我上面使用的。)

【讨论】:

  • 谢谢@T.J.这种情况发生的情况相当普遍吗?
  • @StuartM - 不用担心(顺便说一句,我意识到我很傻,更新了答案)。网络通信(尤其是在移动设备上)可能不可靠,因此您可能需要重试。但是暂时的 404 并不常见,不,这表明 Web 服务器存在问题。
  • 也许你想补充一下这个奇怪现象背后的原因和理由,以使其他读者受益
  • @KunalMukherjee & Archer - 我已经把它折叠成答案了。 :-)
猜你喜欢
  • 2018-10-29
  • 2021-11-02
  • 1970-01-01
  • 2015-08-27
  • 2014-01-04
  • 2011-06-11
  • 2015-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多