Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在CORS中间件中读取自定义头_Javascript_Node.js_Express_Cors - Fatal编程技术网

Javascript 如何在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

我已经使用包创建了CORS中间件。该中间件将在每次调用之前被调用。这是我的实现

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控制台中记录的确切消息是什么?