【问题标题】:axios+node.js+cors : even OPTIONS requests don't reach the serveraxios+node.js+cors : 甚至 OPTIONS 请求也无法到达服务器
【发布时间】:2020-07-08 23:26:12
【问题描述】:

我使用以下第一个中间件。由于令牌标头,对服务器的第一个请求是 OPTIONS 请求。由于某种原因,在重新加载客户端和服务器端后,有时不确定的请求可以到达“控制台” .log("C")' 并发送状态 200。

app.use(function(req, res, next) {
        console.log("A")

        res.setHeader("Access-Control-Allow-Origin", "*"); 
        res.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, token");
        res.header('Access-Control-Max-Age', String(60 * 60 * 24 * 365));

        console.log("B")
        if(req.method === 'OPTIONS'){
          console.log("C")
          res.sendStatus(200);
          return res;
        }

        console.log("D")
        next();
      });

但是由于消息的原因,后续的 GET 或 POST 请求没有通过:

...has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

但是如果使用 curl:

curl -I -X OPTIONS http://127.0.0.1:3003/handler

我总是得到一个正常的响应,它显示了 CORS 的所有必要标头

HTTP/1.1 200 OK
X-Powered-By: Express
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, token
Access-Control-Max-Age: 31536000
Content-Type: text/plain; charset=utf-8
Content-Length: 2
ETag: W/"2-nOO9QiTIwXgNtWtBJezz8kv3SLc"
Date: Sat, 28 Mar 2020 07:24:18 GMT
Connection: keep-alive

使用 GET,POST 请求以类似的方式,通过 curl 一切都很好。但是通过浏览器(使用 axios)它不起作用。再一次,这听起来很疯狂,但有时我更正/重新加载某些东西,请求甚至可能成功,但是当我拉下一个处理程序时,例如,/handler2,一切都会再次下降。

客户:

axios.defaults.baseURL = "http://127.0.0.1:3003";
axios.defaults.headers.common["token"] = window.localStorage.token;

window.axios = axios;
axios.post("/user/handler", postData).then(...).catch(...);

请不要说 app.use(cors()) 或 app.options(...) ))

我已经坐在上面了,天知道有多少……????尽了一切可能。但我认为问题是因为客户端,而不是服务器......最后,对于 curl 它可以工作。

【问题讨论】:

  • 如果浏览器在控制台中记录 CORS 错误消息,您可能希望在 devtools 的“网络”窗格中检查响应,尤其是检查响应的 HTTP 状态代码,以及确认这是 200 OK 成功响应,而不是 4xx 或 5xx 错误。如果不是 200 响应而是 4xx 或 5xx 错误,这是正常的,并且预期浏览器会报告 CORS 错误——但这是因为服务器没有为 4xx 和 5xx 错误添加任何额外的标头。即使是这样,它们仍然是 4xx 和 5xx 错误,这才是真正的问题(不是 CORS)。
  • @sideshowbarker ,响应中没有状态码。但是在响应头HTTP/1.1 431 Request Header Fields Too Large ;Connection: close (服务器记录“A,B,C”,这意味着状态200已经发送)
  • 是的,所以 431 错误才是真正的问题——尽管我不明白为什么这种情况只会偶尔发生,但并非总是如此。
  • @sideshowbarker ,很奇怪,但是 ???? 已将标题名称从“token”更改为“Authorization”(大写字母),似乎可行……希望它是确定性的))
  • 不...错误又出现了

标签: node.js curl axios


【解决方案1】:

我的标准令牌大小是 8 KB,但在 Node.js 中 --max-http-header-size 也是 8 KB。 要解决这个问题,您需要在 package.json 中编写:

 "scripts": {
    "start": "NODE_OPTIONS=--max-http-header-size={YOUR HEADER SIZE} ts-node src/index.ts",
    "watch": "nodemon"
  },

(这是不确定的,因为令牌大小有时可能略小于 8 KB,也许)

【讨论】:

    【解决方案2】:

    如果请求与curl 一起工作正常,那么我认为请求标头正在被浏览器中的某些扩展修改。

    尝试在隐身模式下打开您的客户端 Web 应用程序 在 mozilla firefox 中打开您的客户端 Web 应用程序ctrl+shift+p 在 Chrome 浏览器中打开 ctrl+shift+n 并再次测试。

    如果问题是由浏览器中的任何扩展引起的,您将得到与cur 相同的响应。

    【讨论】:

      猜你喜欢
      • 2020-03-28
      • 2021-02-22
      • 2014-10-07
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      • 2013-10-02
      • 2015-05-08
      • 2014-04-19
      相关资源
      最近更新 更多