javascript 4xx和5xx是否为网络错误?

vbopmzt1  于 2023-01-24  发布在  Java
关注(0)|答案(1)|浏览(163)

我有一个节点服务器,它主要从特定路径读取组件,执行代码,并将数据返回给另一个服务器。
有时在组件的代码执行过程中,我会得到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('');
})
i7uq4tfw

i7uq4tfw1#

4xx和5xx是否为网络错误?
不,它们是HTTP错误响应,* 成功地 * 通过网络从服务器传输到客户端。
我使用. catch()来捕获403响应
我假设你的意思是fetch给出了你链接到的问题。这是使用fetch API的一个常见问题(一个footgun in my view)。fetch只拒绝它对 * 网络错误 * 的承诺,而不是HTTP错误。所以,如果它不能联系到服务器,它将拒绝它的承诺。如果它成功地联系到服务器并收到HTTP错误响应,它 * 不会 *。
您链接的问题(如this one)的答案和我上面链接的博客文章描述了如何使用网络和HTTP错误的公共路径来处理此问题:当你第一次得到Response对象时,检查它的ok属性,如果不为真就抛出,然后在一个通用的拒绝处理程序中处理拒绝。
但是,如果这些资源消失了(不太可能,但是答案应该是自包含的),以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解析)是否工作。

相关问题