Axios: 为“网络错误”设置代码/状态

创建于 2016-07-20  ·  69评论  ·  资料来源: axios/axios

我试图检测我的服务器何时关闭,以便我可以向用户显示适当的错误消息。

在这种情况下,axios 网络请求会抛出一个与所有其他 axios 错误不同的错误,如下所述: https :

在我的代码中,似乎检测此错误的唯一方法是检查 err.message:
if (err.message === "Network Error"){/*tell user the server is down*/}

这让我很困扰,因为字符串比较有点冒险; 也许有一天这条消息会被翻译,我的代码会失败。

如果将 err.status 或 err.code(或 err.???)设置为一些我们可以在代码中检查的文档值,那就太好了。

有没有其他方法可以检测我遗漏的这种情况?
谢谢大家!

最有用的评论

我有这个问题。 有人可以帮我吗?

服务器响应是 401 但 axios 给了我这个:

错误 --> “网络错误”
error.response --> 未定义
error.status --> 未定义

所有69条评论

我想你是正确的。 状态代码是有意义的。

正如有人在#204 中所说的那样,在某些情况下无法在浏览器中捕获网络错误,因此 Axios 以通用错误 ( new Error('Network error') ) 进行响应。 如果您想将它们与错误响应(状态代码 !== 2xx 或自定义检查)区分开来,我认为最好的方法是检查status属性而不是错误消息。 例如:

axios.request(options).catch(function(error) {
  if (!error.status) {
    // network error
  }
});

我认为设置自定义状态代码是一个坏主意(它可能会引起更多混乱)并且设置特定属性根本没有帮助,因为我们只有一个错误情况。

当然在 Node.js 中更容易,因为您可以访问实际错误并且可以根据 Node.js 文档进行检查。

啊,所以 Axios 调用抛出的任何错误都可以保证 1) 有一个状态,或者 2) 是一个通用的网络错误? 我想这已经足够了。

到目前为止,我无法获得像 404,500.. 这样的错误代码,但我仍然收到网络错误。 如何解决这个问题?
instance.post('/foo', {request_id : 12345})
.then(函数(响应){})
.catch(函数(错误){
控制台日志(错误); // 网络错误
控制台日志(错误。状态); // 不明确的
控制台日志(错误代码); // 不明确的
});

网络错误意味着 Axios 根本无法连接到您的服务器,因此无法从服务器获取任何错误代码。 也许尝试使用其他工具(curl、邮递员或浏览器)来确保您可以连接到它?

我可以连接到我的服务器,它实际上返回 404 错误代码,并且与其他一些 API 调用服务器返回 500 内部服务器错误,但我仍然无法通过脚本获取网络错误代码(即,console.log( error.status); // 未定义 )。

它在error.response.status

我有这个问题。 有人可以帮我吗?

服务器响应是 401 但 axios 给了我这个:

错误 --> “网络错误”
error.response --> 未定义
error.status --> 未定义

当错误是“网络错误”时,意味着 Axios 无法连接到您的服务器,或者由于某种原因无法从您的服务器获得响应。 所以 401 错误永远不会进入 Axios。 也许在 StackOverflow 上发布一些带有示例代码的问题?

在使用 AWS API-Gateway 时遇到了这个问题。 对于任何看到相同问题的人来说,4xx 错误(在我的情况下是 401)没有响应 CORS 标头是一个问题。 花了几个小时来解决这个该死的问题! 感谢 @jonathan-stone 指出正确的故障排除方法。

@codygreen我仍然有这个问题,我遇到了这个https://forums.aws.amazon.com/message.jspa?messageID=763752

你找到解决方法了吗?

有没有人有解决这个问题的方法?

我的问题是 Jest+ Axios。 我通过将它添加到我的 package.json 来解决它:

"jest": {
    "testEnvironment": "node"
}

这有效,尽管我似乎找不到支持它的文档。 我假设 error.response 在网络错误上应该是空的,否则它是一个 api 错误。

axios.request(options).catch(function(error) {
  if (!error.response) {
    // network error
  } else {
    // http status code
    const code = error.response.status
    // response data
    const response = error.response.data
  }
});

有没有人找到关于这个的最佳解决方案? Axios 的人会发出一些声音:(

我今天也出现这个错误,不知道是什么问题,这是我的脚本:

js var url = "http://localhost:8000/"; Axios.get(url).then(function(response){ alert(response) }).catch(function(error){ alert(error) });

http://localhost :8000/ 返回一个 JSON 响应,这在其他主机上不起作用

可能是 Cors 错误。

第 87 行,它已在 xhr 适配器中设置为“网络错误”? 如何更改它以便可以捕获错误?
https://github.com/axios/axios/blob/d7f021b8d4cc50bfa0653011bc02452d234d1255/lib/adapters/xhr.js#L84 -L91

我的不好,这不是问题,而是由于浏览器安全性导致的预期行为。 XHR 错误响应现在接收关于错误状态代码的ProgressEvent

我有同样的问题。 我认为这是 CORS 的问题。 有没有人为此找到好的解决方案?

@codygreen您是否设法解决了 API Gateway 的问题? 甚至无法弄清楚响应状态代码来帮助我进一步调试。

这里有同样的普遍问题。 对我来说,这绝对是 CORS。 浏览器正在向服务器发出 OPTIONS 请求,我没有为它们设置处理程序(在节点中)。 Axios 将成功完成(失败的)请求,但响应未定义

      return axios.httpClients.server.post('/someUrl, {
        someData:some_data
      }).then(response => {
        console.log(response);
        //the following errors out because response is undefined
        if (response.data && response.data.success === true) {
        }
      }).catch(err => {
           //catch never triggered
            console.log(err)
      });

你的响应代码是什么? 如果是网络错误,则在使用 Fetch API 时,浏览器会将其记录到控制台,但出于安全原因不会将其传递给 JavaScript,因此主体为空。 参见FETCH STANDERS ,如果要访问响应的网络错误,请将 HTTP 响应代码更改为 200 并在响应正文中包含错误消息。

我的问题是 dns 问题。 它在邮递员中有效,但在 axios 中失败。 尝试卷曲以发现它在那里也失败了。 所以我的DNS没有正确配置。 检查是否遇到此问题。

不确定这是否适用于其他情况,但这是我解决同一问题的方法(考虑到我们正在谈论CORS )。

前端,请确保在PUTPOST请求中将headers作为参数传递:

const axiosParams = {
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Accept': 'application/json',
  },
};

axios.put(`${api.url}/like`, axiosParams)
  .then((response) => {
    // ...
  });

后端,请确保您将 CORS 与 Express 一起使用:

// server.js
const express = require('express');
const app = express();

var cors = require('cors'); // Yep, you need to install this
app.use(cors()); // Works 🎉

参考:这里这里

伙计们,我也在这个问题上挣扎了一段时间。 但是我现在发现了我的 axios post network createError 在 Android 设备上的问题。 axios 网络错误的原因是因为我传递给 axios 的表单数据包含我猜的错误类型的数据对象。 我已经包含了一个图像对象(来自 Expo 的 ImagePicker 对象)作为我认为 axios 不接受的表单数据参数之一。 Axios 可能只接收字符串、浮点数、整数或图像作为参数。 图像不能作为参数传递,它不是一种图像,它是一个反应本机对象,我已经删除了它并通过将 image.uri 分配给参数值来包含一个图像字段作为参数,然后它就可以工作了。 希望这能帮助一些可能遇到与我之前遇到的相同问题的人。
测试axios网络错误的时候把你的一些表单数据一一删除,你就会发现是哪一个是问题的原因。

~ @codygreen @hammadzz您是否通过 Amazon API Gateway 找到了解决方案?~

更新:如果有人使用 API Gateway 和 CORS 偶然发现了这一点,您需要在响应中添加access-control-allow-origin响应标头。

正如有人在#204 中所说的那样,在某些情况下无法在浏览器中捕获网络错误,因此 Axios 以通用错误 ( new Error('Network error') ) 进行响应。 如果您想将它们与错误响应(状态代码 !== 2xx 或自定义检查)区分开来,我认为最好的方法是检查status属性而不是错误消息。 例如:

axios.request(options).catch(function(error) {
  if (!error.status) {
    // network error
  }
});

我认为设置自定义状态代码是一个坏主意(它可能会引起更多混乱)并且设置特定属性根本没有帮助,因为我们只有一个错误情况。

当然在 Node.js 中更容易,因为您可以访问实际错误并且可以根据 Node.js 文档进行检查。

如果您来自 Google,请注意此 API 已弃用。 这是从 2016 年开始的,v <0.13。

你要检查error.response当服务器响应时, error.response === undefined为脱机状态和特殊情况下error.code === 'ECONNABORTED'的超时。

更新:如果有人使用 API Gateway 和 CORS 偶然发现了这一点,您需要在响应中添加响应标头:

access-control-allow-origin: *

绝对不要这样做。 相应地设置原点而不是*

对我来说,这是 cors 问题,如果您使用的是 Laravel,并且您定义了一个

 ->middleware(['auth:api'])

您必须将您需要的所有其他中间件显式添加到此路由中,它不是继承的

->middleware(['auth:api','cors']);

我也遇到过这个问题,请使用您的本地 IP 地址而不是 localhost(例如 10.0.0.12:8083 )。 它对我有用。

因此,如果我有正确的信息,则 axios 请求中的 0 状态似乎在某些情况下会出现。 但它不能以编程方式确定它遇到的确切情况。

这些情况包括CORS 预检请求失败时,因此甚至从未尝试过实际请求。 因此,404 状态是不合适的。

有人需要给@joelnet买啤酒。 这挽救了我的一天:

https://github.com/axios/axios/issues/383#issuecomment -308606088

其他人可能有不同的问题,但这对我有用。

我间歇性地收到此错误。 我猜这不是 CORS 问题。
我的 api/server 是一个 .net 服务器。
还有其他人间歇性地面临这个问题吗?

我遇到这个错误是因为我没有指定 HTTP 或 https。 主要是代码本身在未定义的协议上抛出错误。 这应该被处理或在错误元中,它应该被包括在内。

正如@jonathan-stone 所说,我认为这无法纠正,因为 Axios 根本不知道发生了什么。 这就像让你的朋友出去玩Funyuns,他说商店关门了。 上面写着“一直营业”——为什么商店关门了。 他们是否永久关闭(404)? 有人生病了吗(500)? 他们的库存是否用完了 (503)? 他不知道,他们只是关闭了(网络错误)!

在尝试从我的 API 检索不同类型的数据的本地 Express 服务器上快速连续触发 Axios 时,我收到此错误。 并不是 Axios 没有报告正确的错误——它不能——我的 Express 服务器没有响应任何东西,因为它太忙了。

如果我重试请求(使用来自 #164 的retry-axios ),我可以获得数据,或者如果 AVAILABLE 服务器出现问题,可能会出现真正的错误。

要解决您需要始终指定的问题
nginx

add_header 'Access-Control-Allow-Origin' *总是

要解决您需要始终指定的问题
nginx

add_header 'Access-Control-Allow-Origin' *总是

不要这样做。 永远不要这样做。 您不会为了让一个连接通过而停用防火墙。

大家好,我们已经在我们的代理上设置了实体大小保护,它返回一般错误,但我无法获得 413 状态代码......这是否可能?

Screenshot 2019-05-07 at 14 19 26

您是否尝试过response对象?
axios.get(url).then(stuff => console.log(Object.keys(stuff.response));

@ComputerCarl你认为它有成功的反应吗? 不要这么认为,因为它以catch结尾,但我可以试试......

对不起! 我的头在别处! 检查 catch 对象...catch(err => console.log(Object.keys(err.response));

Axios 文档

我在我的一个程序中;
err.response.data.message;

我从快递寄出的;

app.use(function (err, req, res, next) {
  res.status(err.status || 500);
  // this is err.response.data on Axios client
  res.send({ message: 'my custom error' });
});

@ComputerCarlerror.response未定义,与error.status :) 你可以在屏幕截图上看到它,我已经在console.log了。 只有error.request是 XMLHttpRequest 对象,如您所见

好的.. 我不知道你为什么会收到两个错误(除了 CORS 之外,还有 413)。 但是,如果您使用 Express,则应该启用 CORS;

const cors = require('cors');
// ...
app.use(cors());

另外,正如我上面所说的,如果服务器完全拒绝您的请求,那么 Axios 不知道是什么导致了错误。 在这一点上,我很难过,你必须等待更聪明的人来回答。 :-)

@ComputerCarl感谢您的尝试 :-D CORS 很好,我对应用程序中的相同 API 有很多不同的调用,并且这些工作正常。 即使是从 API 返回的错误,我也可以轻松处理。 问题是只有在代理级别取消了这一点。

我不知道这是否对您有帮助,但我创建了一个代理请求的应用程序。 我使用的框架正在吞噬 Express 错误。 最后,在明确转发错误res.send({ message: messageFromProxy }); ,我能够看到错误并在客户端上进行处理。

祝你好运。

@jonathan-stone 说,网络错误意味着 Axios 根本无法连接到您的服务器,因此它无法从服务器获取任何错误代码。

可能这会帮助某人。

error.data ;

@balwant-sd 正如你在我在这里发送的截图中看到的那样,浏览器正确识别了 413 状态代码,但 axios 没有

即使在网络选项卡中,我也可以看到 413 状态代码...
Screenshot 2019-06-03 at 15 42 12

如上所述,返回 401 错误的登录 POST 仅返回“网络错误”,代码为 un​​defined 而不是 401。

因此,此错误似乎是配置错误的 CORS 错误,它仅反映在您的网络选项卡上。 我和@ketysek有同样的问题,似乎我的 ngnix 没有为此应用 CORS。 如前所述,一般的网络错误永远不会进入 axios error.response 。 在这里,我喜欢责怪后端......哦等等,我做到了......

你好,我也有同样的问题,即使请求获得正确的响应 axios 总是返回“网络错误”并转到 .catch(function(error) {}); 标准杆有没有人解决这个问题?

我今天遇到了同样的问题。 此问题主要与后端不允许跨站点 HTTP 请求有关。 就我而言,我使用的是 django,因此我将 corsheaders 类尽可能高地放置到 MIDDLEWARE :
MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', //..etc ]
我创建了一个 CORS_ORIGIN_WHITELIST 只允许某些来源:
CORS_ORIGIN_WHITELIST = [ "http://localhost:8081" , //..etc ]
这是用于 django-cors-headers。 如果您不是 django 用户,您应该查看您最喜欢的 cors 头文件模块的文档。

正如有人在#204 中所说的那样,在某些情况下无法在浏览器中捕获网络错误,因此 Axios 以通用错误 ( new Error('Network error') ) 进行响应。 如果您想将它们与错误响应(状态代码 !== 2xx 或自定义检查)区分开来,我认为最好的方法是检查status属性而不是错误消息。 例如:

axios.request(options).catch(function(error) {
  if (!error.status) {
    // network error
  }
});

我认为设置自定义状态代码是一个坏主意(它可能会引起更多混乱)并且设置特定属性根本没有帮助,因为我们只有一个错误情况。

当然在 Node.js 中更容易,因为您可以访问实际错误并且可以根据 Node.js 文档进行检查。

这种方法的问题是假设我们在 axios.then 中运行了一些代码并且代码有一些错误,例如“分配给常量”(这是我的情况),使用您提到的方法,我们将收到“的网络错误”赋值给常量”

代码示例:

axios(options).then(() => {
  const foo = '';
  foo = 'bar'; // will throw error "assignment to constant"
}).catch(error => {
  if (!error.status) {
    // "assignment to constant" will be considered as network error
  }
})

我使用此实用程序函数从调用堆栈的较低位置捕获网络错误(防止将非 axios 错误识别为网络错误):

function isNetworkError(err) {
  return !!err.isAxiosError && !err.response;
}

https://github.com/axios/axios/pull/1419

我使用此实用程序函数从调用堆栈的较低位置捕获网络错误(防止将非 axios 错误识别为网络错误):

function isNetworkError(err) {
  return !!err.isAxiosError && !err.response;
}

见#1419

解决了问题
谢谢

@mifi你能展示一个更详细的例子,说明你如何使用isNetworkError来防止将非 axios 错误识别为网络错误吗?

像这样:

try {
  ...
  some code that calls axios
  ...
} catch (err) {
  if (isNetworkError(err)) return alert(‘check your connection);
  throw err;
}

如果是 CORS 错误并且您使用无服务器,则可以修复它:

resources:
  Resources:
    # CORS for 4xx errors
    GatewayResponseDefault4XX:
      Type: 'AWS::ApiGateway::GatewayResponse'
      Properties:
        ResponseParameters:
          gatewayresponse.header.Access-Control-Allow-Origin: "'*'"
          gatewayresponse.header.Access-Control-Allow-Headers: "'*'"
        ResponseType: DEFAULT_4XX
        RestApiId:
          Ref: 'ApiGatewayRestApi'

当错误是“网络错误”时,意味着 Axios 无法连接到您的服务器,或者由于某种原因无法从您的服务器获得响应。 所以 401 错误永远不会进入 Axios。 也许在 StackOverflow 上发布一些带有示例代码的问题?

我也遇到了同样的错误,对我来说,它到达服务器,我用 403 和一个 JSON 响应,这导致 Axios 中的Network Error

我能够在浏览器网络选项卡中看到响应,但在 catch 块中err.response未定义

image

image

@narenderv7我也是

@WarisR我通过在服务器端允许 cors 来解决这个问题。 我以为是 Axios 问题,但实际上不是。 如果您让我知道您真正面临的问题,我可以帮助您。

在服务器中添加'Access-Control-Allow-Origin': '*'

@ketysek我有同样的错误

Screenshot from 2019-12-26 16-48-22

你有没有找到一种方法来捕捉这个错误?

嗨,伙计们,我遇到了 CORS 错误问题,其中收到状态为 403 (4 * & 5 ) 的响应Nginx 发送标头“Access-Control-Allow-Origin”仅用于响应状态 2 & 3 *。

我解决了这个问题,从以下位置编辑 nginx 配置:
add_header 'Access-Control-Allow-Origin' '*';
到:
add_header 'Access-Control-Allow-Origin' '*' always;

我有同样的问题,我正在使用 axios 0.18.0 和 0.19.0 对其进行测试

脚步:
我用过期的令牌请求有时错误.响应正确,但有时错误响应未定义并且消息是“网络错误”。 为什么这是后端错误或 axios 中的错误?

有时它可能是由浏览器中的 AD 阻止程序引起的...
试试incognitoprivate模式,或者下载一个新的浏览器来测试...

@narenderv7是的,这是服务器端错误。 不过我觉得Axios应该可以处理这种情况的错误吧?

我需要区分这两种情况:

正如我检查的那样。 catch块的错误返回在上述两种情况下都是相同的。

还有一个问题:
https://github.com/axios/axios/issues/1296

错误仍然存​​在,如果有人对此问题有解决方案,请与我们分享。

我使用此实用程序函数从调用堆栈的较低位置捕获网络错误(防止将非 axios 错误识别为网络错误):

function isNetworkError(err) {
  return !!err.isAxiosError && !err.response;
}

见#1419

超时错误也可以匹配这些条件。
image

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

cruelbob picture cruelbob  ·  37评论

kalaspuffar picture kalaspuffar  ·  36评论

kyeotic picture kyeotic  ·  64评论

corujoraphael picture corujoraphael  ·  46评论

rafaelbiten picture rafaelbiten  ·  99评论