【发布时间】:2019-09-02 04:02:46
【问题描述】:
我想使用 fetch 从端口 3000 上的 React 前端以 JSON 格式将一些数据发送到 3005 上的 node.js 服务器。我在服务器上配置了 cors,但每次尝试使用 cookie 发送请求时, Chrome 抛出错误:
从源“http://localhost:3000”获取“http://localhost:3005/user-connected”的访问权限已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:“Access-Control-Allow-Origin”的值' 当请求的凭据模式为 'include' 时,响应中的标头不能是通配符 '*'。
所有来自服务器代码的 console.log 都被跳过。
当我在获取代码中删除标题时
“内容类型”、“应用程序/json”
我得到了 cookie,但没有数据。包含此标头但没有凭据:“include”,我可以获取我的数据,但我永远不会同时获取两者。
这是我的获取代码:
fetch("http://localhost:3005/user-connected", {
mode: "cors",
method: "post",
headers: [
["Content-Type", "application/json"],
],
credentials: "include",
body: JSON.stringify({data: "123"})
})
.then(data => data.json())
.then((data) => {
console.log(`Response: ${JSON.stringify(data)}`);
}).catch(err => {
console.log(`Error: ${err}`)
});
Node.js cors 配置:
app.use(cors({credentials: true}));
app.use((req, res, next) => {
res.setHeader('Access-Control-Allow-Origin', 'http://localhost:3000');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,Content-Type', 'Access-Control-Allow-Origin', 'Origin');
res.setHeader('Access-Control-Allow-Credentials', true);
next();
});
还有我的发帖路线:
let cookiesData = (req, res) => {
console.log(`Cookie user-connected: ${req.cookies.io}`)
console.log(`Received data: ${JSON.stringify(req.body)}`);
res.send({ status: "OK" });
}
router.post("/user-connected", cors({origin: 'http://localhost:3000'}), cookiesData);
甚至可以做我想做的事吗?或者我错过了一些重要的配置?
【问题讨论】:
-
@Mark 我做了,但没有任何改变。是的,它是节点
-
您能否向您的服务器发送一个带有 OPTIONS 的请求(飞行前请求),以验证 cors 标头是否设置正确?
-
@JonasWilms 我不知道该怎么做。当我尝试使用 fetch 执行此操作时,我收到错误,它不是有效的方法。当我使用 POST 获取时,服务器告诉我 OPTION 请求以代码 204 结束
-
使用 Postman 或 curl (getpostman.com)
-
@JonasWilms 当我向 Postman 提出 OPTIONS 请求时,我得到 Access-Control-Allow-Origin -> * 所以如果我想要凭证不是很好吗?我将此行添加到我的服务器 app.options('*', cors("localhost:3000"));,但邮递员仍然给我 * 而不是这个地址。
标签: javascript node.js reactjs cors fetch