我试图处理CORS问题,并添加必要的字符串以响应其标题:
var express = require('express');
const app = express();
var router = express.Router();
router.options('/*', function(req, res, next){
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
res.sendStatus(200);
console.log(res.getHeaders());
});`但它不起作用- console.log(res.getHeaders())显示了标准标题:
[Object: null prototype] {
'x-powered-by': 'Express',
'content-type': 'text/plain; charset=utf-8',
'content-length': '2',
etag: 'W/"2-nOO9QiTIwXgNtWtBJezz8kv3SLc"'
}什么可以阻止触发此功能?
绝望中,我尝试了这个结构:
router.options('/*', function(req, res, next){
const respond = async function() {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
}
respond()
res.sendStatus(200);
console.log(res.getHeaders());
});`它确实起作用了:
[Object: null prototype] {
'x-powered-by': 'Express',
'access-control-allow-origin': '*',
'access-control-allow-headers': 'Origin, X-Requested-With, Content-Type, Accept',
'content-type': 'text/plain; charset=utf-8',
'content-length': '2',
etag: 'W/"2-nOO9QiTIwXgNtWtBJezz8kv3SLc"'
}
OPTIONS /email 200 4.345 ms - 2我做错了什么,在哪里找错了
发布于 2022-11-29 19:28:23
带有CORS处理中间件的app.use语句必须先于其他中间件。这些语句必须都在顶层,而不是相互嵌套:
const app = express();
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
var router = express.Router();
router.options('/*', function(req, res, next){
res.sendStatus(200);
console.log(res.getHeaders());
});嵌套的app.use语句只有在传入的请求由router处理时才会执行。但是到那时已经太晚了,因为这将有效地注册最后处理中间件的CORS。
您的分离解决方案可以工作,因为它不涉及注册新的中间件。
作为本地CORS处理程序的替代,您可能需要考虑cors包。
发布于 2022-11-29 19:46:32
我发现我可以把res.header(.)直接进入路由器的主体,而不使用app.use():
router.options('/*', function(req, res, next){
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
res.sendStatus(200);
console.log(res.getHeaders());
});而且起作用了。也许,解决方案总是表面上的,但我花了将近一天的时间来获得这个结果:)
https://stackoverflow.com/questions/74618656
复制相似问题