Javascript 如何在CORS中间件中读取自定义头
我已经使用包创建了CORS中间件。该中间件将在每次调用之前被调用。这是我的实现Javascript 如何在CORS中间件中读取自定义头,javascript,node.js,express,cors,Javascript,Node.js,Express,Cors,我已经使用包创建了CORS中间件。该中间件将在每次调用之前被调用。这是我的实现 const corsMiddleware = async (req, callback) => { const { userid } = req.headers|| req.cookies {}; let whiteList = await getWhiteListDomains(userid) return callback(null, { origin: whiteList, c
const corsMiddleware = async (req, callback) => {
const { userid } = req.headers|| req.cookies {};
let whiteList = await getWhiteListDomains(userid)
return callback(null, {
origin: whiteList,
credentials: true,
allowedHeaders: ["userid", "authorization", "content-type"]
});
};
并在路由初始化之前添加了该中间件
app.use(cors(corsMiddleware));
app.options("*", cors(corsMiddleware));
app.get("/user", (req, res, next)=>{
// code
})
从浏览器中,我试图调用API作为
axios({ method: "get", url: "http://localhost:3000/user", headers: {userId:"1234"} });
在服务器上调试时,我看到
access-control-request-headers:"userid"
在请求对象的头中
我无法读取自定义标题。这可能是因为我试图在CORS初始化之前读取自定义头。但是,我仍然想阅读自定义标题 代码中主要有两个问题 第一个更容易解决的问题是,在设置
访问控制允许标头的选项中缺少访问控制允许原点
:
return callback(null, {
origin: whiteList,
credentials: true,
allowedHeaders: [
"access-control-allow-origin",
"authorization",
"content-type",
"userid"
]
});
第二个是最重要的,因为它与CORS的工作方式有关。
您遇到的问题是,CORS已经拒绝了飞行前选项
请求中的申请。它从不允许浏览器执行GET
请求
let whiteList = await getWhiteListDomains(userid); // userid === undefined
console.log(whitelist); // undefined
return callback(null, {
origin: whiteList, // undefined
credentials: true,
allowedHeaders: ["userid", "authorization", "content-type"]
});
您说您想读取飞行前选项
请求中的自定义标题userId
,但您不能。原因是飞行前选项请求是由浏览器自动创建的,它不会使用您在Axios调用中设置的自定义标题。它将只发送CORS:
Origin // URL that makes the request
Access-Control-Request-Method // Method of the request is going to be executed
Access-Control-Request-Headers // Headers allowed in the request to be executed
由于未发送您的自定义标头,因此在飞行前选项中
尝试访问userId
的值时,您会得到一个未定义的值:
const { userid } = req.headers|| req.cookies;
console.log(userid); // undefined
而且,由于您在异步函数getWhiteListDomains
中使用的值不匹配,因此可能会得到另一个未定义的,CORS中间件的origin
选项中设置的值为undefined
,该值会导致CORS中间件拒绝飞行前OPTIONS
请求
let whiteList = await getWhiteListDomains(userid); // userid === undefined
console.log(whitelist); // undefined
return callback(null, {
origin: whiteList, // undefined
credentials: true,
allowedHeaders: ["userid", "authorization", "content-type"]
});
我不完全确定您尝试使用自定义标题作为CORS检查的目的是什么,但我的建议是,在处理自定义CORS配置时,只检查源代码标题,因为这是它的目的:
如果您对在服务器接收的请求中创建任何类型的授权或受用户实现的限制感兴趣,我建议您使用不同的自定义中间件,而不要像您现在尝试的那样涉及CORS。您必须解析您的请求
试试这个
npmi主体解析器
及
你到底想读什么请求头?@sideshowbarker我已经在头中传递了userid。现在我想阅读cors中间件中的标题。目前所写的问题不清楚,并且缺少任何人都必须回答的细节。您应该更新问题,以包括关于您正在测试的硬件的解释。您是否从浏览器中运行的前端JavaScript代码发送请求?如果是的话,那代码是什么样子的?您检查过浏览器devtools控制台了吗?浏览器在那里记录的确切信息是什么?@sideshowbarker我已经更新了这个问题。请参阅,这可以帮助您了解浏览器在devtools控制台中记录的确切消息是什么?