【发布时间】: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”(大写字母),似乎可行……希望它是确定性的))
-
不...错误又出现了