我试图检测我的服务器何时关闭,以便我可以向用户显示适当的错误消息。
在这种情况下,axios 网络请求会抛出一个与所有其他 axios 错误不同的错误,如下所述: https :
在我的代码中,似乎检测此错误的唯一方法是检查 err.message:
if (err.message === "Network Error"){/*tell user the server is down*/}
这让我很困扰,因为字符串比较有点冒险; 也许有一天这条消息会被翻译,我的代码会失败。
如果将 err.status 或 err.code(或 err.???)设置为一些我们可以在代码中检查的文档值,那就太好了。
有没有其他方法可以检测我遗漏的这种情况?
谢谢大家!
我想你是正确的。 状态代码是有意义的。
正如有人在#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 )。
在前端,请确保在PUT
或POST
请求中将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' *总是;
要解决您需要始终指定的问题
nginxadd_header 'Access-Control-Allow-Origin' *总是;
不要这样做。 永远不要这样做。 您不会为了让一个连接通过而停用防火墙。
大家好,我们已经在我们的代理上设置了实体大小保护,它返回一般错误,但我无法获得 413 状态代码......这是否可能?
您是否尝试过response
对象?
axios.get(url).then(stuff => console.log(Object.keys(stuff.response));
@ComputerCarl你认为它有成功的反应吗? 不要这么认为,因为它以catch
结尾,但我可以试试......
对不起! 我的头在别处! 检查 catch 对象...catch(err => console.log(Object.keys(err.response));
我在我的一个程序中;
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' });
});
@ComputerCarl但error.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 状态代码...
如上所述,返回 401 错误的登录 POST 仅返回“网络错误”,代码为 undefined 而不是 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;
}
我使用此实用程序函数从调用堆栈的较低位置捕获网络错误(防止将非 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
未定义
@narenderv7我也是
@WarisR我通过在服务器端允许 cors 来解决这个问题。 我以为是 Axios 问题,但实际上不是。 如果您让我知道您真正面临的问题,我可以帮助您。
在服务器中添加'Access-Control-Allow-Origin': '*'
@ketysek我有同样的错误
你有没有找到一种方法来捕捉这个错误?
嗨,伙计们,我遇到了 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 阻止程序引起的...
试试incognito
或private
模式,或者下载一个新的浏览器来测试...
@narenderv7是的,这是服务器端错误。 不过我觉得Axios应该可以处理这种情况的错误吧?
我需要区分这两种情况:
正如我检查的那样。 catch
块的错误返回在上述两种情况下都是相同的。
错误仍然存在,如果有人对此问题有解决方案,请与我们分享。
我使用此实用程序函数从调用堆栈的较低位置捕获网络错误(防止将非 axios 错误识别为网络错误):
function isNetworkError(err) { return !!err.isAxiosError && !err.response; }
见#1419
超时错误也可以匹配这些条件。
最有用的评论
我有这个问题。 有人可以帮我吗?
服务器响应是 401 但 axios 给了我这个:
错误 --> “网络错误”
error.response --> 未定义
error.status --> 未定义