无法获取vanilla javascript中的错误

Failed to Fetch error in vanilla javascript

提问人:Rob_Da_Joyce 提问时间:11/8/2023 更新时间:11/8/2023 访问量:37

问:

我们有一个网站,我已经开始实现 fetch API,而不是使用 jquery ajax,开始从 jquery 转向 vanilla。

我时不时地收到一个错误,其中 fetch API 抛出错误。我知道这一点,因为我已将其设置为在出现任何错误时向我发送电子邮件。但是,该错误不是很具有描述性。它只是说“无法获取”。这是什么意思?

请注意,此错误仅在某些时候发生。这个带有此 url 的函数每天被触发数百次,如果不是数千次,我可能每天收到一两次错误。

下面是 javascript:

    async function fetchSimple(url, data = null, attempts = 0) {
        
        try {

            var response = await fetch(url, {
                method: "POST",
                body: data,
                headers: { 'Content-type': 'application/json; charset=UTF-8' }
            });

            if (response.ok) {
                var responseJSON = await response.json();
                return responseJSON.d;
            } else {
                throw new Error(`Status: ${response.status}, StatusText ${response.statusText}`);
            }

        } catch (error) {
            attempts++;
            if (attempts == 1)
                fetchSimple(url, data, attempts);
            else {
                alert(`Failed to ${url}\n\nError Message: ${error.message}\n\nAn email logging the error details has been sent to the development team`);
                sendErrorLogEmail2(url, error.message, data);
            }
        }
    }

这是我通过电子邮件收到的错误报告: 主题:无法执行 /Yazzoo/Product.aspx/BuildProductDesignPositionsSectionUI

error:无法提取

dataJSON: { “productId”:24999 }

浏览器:{“name”:“Chrome”,“version”:“118”,“screenType”:“mobile”}

javascript 错误处理 fetch-api

评论

0赞 mplungjan 11/8/2023
这似乎是一个问题,递归调用在等待中。我想你需要if (attempts == 1) return fetchSimple(url, data, attempts);
0赞 mplungjan 11/8/2023
将数据传递给 fetchSimple 时是否将其字符串化?
0赞 mplungjan 11/8/2023
如果 sendErrorLogEmail2 是异步的,则需要等待它。警报也是一个阻止程序。也许更新页面元素?
0赞 Rob_Da_Joyce 11/8/2023
这是在等待。此外,当我调用它时,除了我想“重试”它的一次之外,尝试也默认为 0,这仅发生在函数内部。
0赞 Rob_Da_Joyce 11/8/2023
我也确实说过:“请注意,此错误仅在某些时候发生。这个带有此 url 的函数每天被触发数百次,甚至数千次,而我可能每天收到一两次错误。

答:

0赞 Loebstahhhh 11/8/2023 #1

提取请求返回“无法提取”的原因有很多。

有时提取失败的最可能原因是由于网络中断。这些事情发生了,你需要相应地处理它们。

其他原因可能包括:

  1. CORS 错误
  2. 错误的 URL
  3. 错误的协议
  4. 使用了错误的方法。

浏览器的开发人员工具应为您提供有关获取请求失败原因的更多信息。不幸的是,错误对象中并没有包含不太通用的错误消息。

如果您有兴趣,Fetch 标准列出了 TypeError 发生的所有可能原因(有很多可能的原因): https://fetch.spec.whatwg.org/#fetch-method

评论

0赞 Rob_Da_Joyce 11/8/2023
由于错误的间歇性,听起来像是网络中断。其他问题每次都会发生。如果他们能在错误消息中明确告诉我们,那就太好了