axios+;node.js+;cors:偶数选项请求不';我无法到达服务器

axios+;node.js+;cors:偶数选项请求不';我无法到达服务器,node.js,curl,axios,Node.js,Curl,Axios,我使用follow first中间件。由于令牌头的原因,对服务器的第一个请求是OPTIONS request。由于某些原因,在重新加载客户端和服务器端之后,有时不确定地请求可以到达“console.log(“C”)”并发送状态200 app.use(function(req, res, next) { console.log("A") res.setHeader("Access-Control-Allow-Origin", "*"); res.

我使用follow first中间件。由于令牌头的原因,对服务器的第一个请求是OPTIONS request。由于某些原因,在重新加载客户端和服务器端之后,有时不确定地请求可以到达“console.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,以类似的方式发布请求,通过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(…)


我已经坐在上面了,天知道有多少…我的标准令牌大小是8KB,但在Node.js中——最大http头大小也是8KB。 要解决此问题,您需要在package.json中编写:

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

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

我的标准令牌大小是8KB,但在Node.js中——最大http头大小也是8KB。 要解决此问题,您需要在package.json中编写:

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

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

在浏览器在控制台中记录CORS错误消息的情况下,您可能需要在devtools的网络窗格中检查响应,尤其是检查响应的HTTP状态代码,并确认这是一个200 OK的成功响应,而不是4xx或5xx错误。如果不是200响应,而是4xx或5xx错误,则浏览器会报告CORS错误,这是正常的,因为服务器不会向4xx和5xx错误添加任何附加头。即使有,它们仍然是4xx和5xx错误,这才是真正的问题(不是CORS)。@sideshowbarker,响应中没有状态代码。但是在响应头
HTTP/1.1431请求头字段过大;连接:关闭
(服务器记录“A、B、C”,这意味着状态200已发送)是的,因此431错误才是真正的问题-尽管我不明白为什么这只会偶尔发生,但并不总是发生。@sideshowbarker,奇怪,但是没有…错误再次出现在浏览器在控制台中记录CORS错误消息的情况下,您可能需要特别检查devtools中网络窗格中的响应,检查响应的HTTP状态代码,并确认它是200 OK成功响应,而不是4xx或5xx错误。如果不是200响应,而是4xx或5xx错误,则浏览器会报告CORS错误,这是正常的,因为服务器不会向4xx和5xx错误添加任何附加头。即使有,它们仍然是4xx和5xx错误,这才是真正的问题(不是CORS)。@sideshowbarker,响应中没有状态代码。但是在响应头
HTTP/1.1431请求头字段过大;连接:关闭(服务器记录“A,B,C”,这意味着状态200已被发送)是的,因此431错误才是真正的问题-尽管我不明白为什么这只会偶尔发生,但并不总是发生。@sideshowbarker,奇怪,但没有…错误再次出现