多次调用后没有 Access-Control-Allow-Origin 编辑 > Axios 网络错误捕获

Posted

技术标签:

【中文标题】多次调用后没有 Access-Control-Allow-Origin 编辑 > Axios 网络错误捕获【英文标题】:No Access-Control-Allow-Origin after many calls edit > Axios network error catch 【发布时间】:2021-03-18 05:50:52 【问题描述】:

我经常用谷歌搜索这个问题,我想我已经插入了所有我知道是多余的但我很绝望的东西。 在我的服务器中,我添加了:

app.use(cors())

app.use(function (req, res, next) 
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
  res.setHeader('Access-Control-Allow-Methods', 'POST, GET, PATCH, DELETE, OPTIONS');
  next();
);

在路线中,我添加了:


router.use(['/api/', '/api/:page?'], (req, res) => 
  res.setHeader("Access-Control-Allow-Origin", "*");
  res.setHeader("Access-Control-Allow-Methods", "*");
  res.setHeader(
    "Access-Control-Allow-Headers",
    "Origin",
    "X-Requested-With",
    "Content-Type",
    "Accept",
    "X-Requested-With,content-type"
  );
  res.setHeader("Access-Control-Allow-Credentials", true);

 //code and stuff
)

我在 nginx 中添加了:

    if ($request_method ~* "(GET|POST)") 
      add_header "Access-Control-Allow-Origin"  *;
    

    if ($request_method = OPTIONS ) 
      add_header "Access-Control-Allow-Origin"  *;
      add_header "Access-Control-Allow-Methods" "GET, POST, OPTIONS, HEAD";
      add_header "Access-Control-Allow-Headers" "Authorization, Origin, X-Requested-With, Content-Type, Accept";
      return 200;
    

前端调用:

    return axios.post("https://example.com/api/", data, 
        headers: 
          "Content-Type": "multipart/form-data",
          "Access-Control-Allow-Origin": '*',
          "Access-Control-Allow-Method": 'GET,PUT,POST,DELETE,PATCH,OPTIONS'
        ,
      )
      .then((res) => 
        console.log(res.data);
    )

我不确定 cors 是否是问题所在,因为路由工作正常,但经过几次请求后,我收到此错误,并且它一直存在,直到我重新启动服务器。

123.ngrok.io/:1 Access to XMLHttpRequest at 'https://example.com/api' from origin 'https://123.ngrok.io' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Error: Network Error
    at createError (createError.js:16)
    at XMLHttpRequest.handleError (xhr.js:83)

因此,总而言之,该路线运行良好,但出现该错误后,它不会消失,直到重新启动。 提前谢谢!

【问题讨论】:

考虑以下想法:一段时间后,您的应用程序逻辑(“代码和东西”)会中断并且无法正确处理。因此,您创建的响应(或为您创建更好的响应)缺少 CORS 所需的标头并被客户端阻止。但这在很大程度上取决于您的快速设置。 @CKE,感谢您的评论。我没有考虑到这一点,我将进一步深入研究该领域。 查看此页面上的“编写错误处理程序”部分:expressjs.com/en/guide/error-handling.html。定义一个错误处理程序(最后)并像在第一个 app.use(...) sn-p 中一样应用标头。不要忘记调用 next() 来应用 express 的默认错误处理程序。它应该向您发送包含堆栈跟踪的畅通响应(仅限非生产环境)。 在前端附加Access-Control-Allow-xxx header 是没有用的和浪费的。这些标头只能由服务器添加,因为它们仅由浏览器在服务器响应时使用。将它们设置在前端除了表明您可能不了解它们的工作原理之外,什么也做不了。 另外,当您在前端设置content-type 时,content-type 必须代表您在 POST 正文中发送的数据类型,而不是您期望返回的数据类型。您发送的 data 变量真的是 multipart/form-data 吗? 【参考方案1】:

我发现了这个问题。 所以我有时会收到错误,但事实证明,每次我上传一个大文件时都会发生这种情况。

后端: 我收到的回复是正确的,它与 cors() 或标头无关,因为它没有触发标头,而实际上我的 /api 的路由配置中根本没有触发任何内容。该路线的第一行甚至没有简单的控制台日志。

FRONTEND:我捕获到该路由的 axios 发布请求中的前端错误给了我一个我无法理解的模糊错误。经研究,设计为不获取状态码:The Discussion on Github with Axios。

我的 catch 错误日志:

Access to XMLHttpRequest at 'http://localhost/' from origin 'https://123.ngrok.io' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
thatFetchRequestCatch.js:91 Error: Network Error
    at createError (createError.js:16)
    at XMLHttpRequest.handleError (xhr.js:83)

Postman:我应该先使用 Postman 来看看真正的错误是什么。原来是:413 Request Entity Too Large

我查看了 NGINX 的错误日志 2020/12/10 13:51:39 [error] 1376#12612: *60 client intended to send too large body: 3897316 bytes, client: 127.0.0.1, server: localhost, request: "POST /api HTTP/1.1", host: "localhost"

所以解决方案是添加 client_max_body_size 20M; 到我在 http 下的 NGINX 配置文件,我很高兴。

所以真正的问题是 NGINX,但是对于即使在配置您的 cors() 之后使用 Axios 收到此错误的其他人,请使用 postman 尝试您的路线或查看您的 NGINX 日志以查看真正的错误。

祝遇到此问题的其他人好运。

【讨论】:

以上是关于多次调用后没有 Access-Control-Allow-Origin 编辑 > Axios 网络错误捕获的主要内容,如果未能解决你的问题,请参考以下文章

添加 WKWebView 后 IONIC 中的 CORS API 调用问题

verilog中,对一个模块的多次调用,比如前一个调用还没有结束的情况下,就再次调用,后者是不是会覆盖前者?

Vuelidate在页面加载时多次触发

我们如何多次调用 NativeBannerAd 的 loadAd 方法?

多次调用 pd.DataFrame.plot() 后颜色一致

为啥在循环内调用 publishProgress 并多次调用(没有循环)会显示不同的行为?