Node.js Can';无法使用Express API找到CORS错误的原因
我有一个静态网站,我正在添加一个简单的点击跟踪器。这是来自网站的JS:Node.js Can';无法使用Express API找到CORS错误的原因,node.js,cors,Node.js,Cors,我有一个静态网站,我正在添加一个简单的点击跟踪器。这是来自网站的JS: function addHit() { let options = { method: "POST", body: JSON.stringify({}), }; fetch("https://myapi.com/hit", options); } window.onload = addHit; 此请求到达Express服务器: const express = require("express"
function addHit() {
let options = {
method: "POST",
body: JSON.stringify({}),
};
fetch("https://myapi.com/hit", options);
}
window.onload = addHit;
此请求到达Express服务器:
const express = require("express");
const app = express();
const cors = require("cors");
app.use(
cors({
origin: "https://www.mywebsite.com",
})
);
app.get("/", (req, res) => {
// code rendering hits so I can see them...
});
app.post("/hit", (req, res) => {
// code updating hits in database
// returns res.status(200) on success
// returns res.status(400) on failure
});
let port = process.env.PORT;
if (port == null || port == "") {
port = 8000;
}
const listener = app.listen(port, function () {
console.log("Your app is listening on port " + listener.address().port);
});
当我打开我的网页时,点击次数按预期更新。但30秒后,我在控制台中发现两个错误
“跨源请求被阻止:同一源策略不允许在读取远程资源。(原因:CORS标头“访问控制允许源”丢失)。”
“TypeError:尝试获取资源时出现NetworkError。”
Access Control Allow Origin标头应由cors
包添加,如果请求确实被阻止,则不应更新命中计数
如果您对可能导致这种情况的原因有任何意见,我们将不胜感激。如果需要更多的代码,我很乐意添加它,但是删除静态站点的一个发布片段会清除所有错误。
这样做的目的是限制通过的源访问
app.use(
cors({
origin: "https://www.mywebsite.com",
})
);
相反,你想做的是
虽然如果您正在使用CORS库,您可以
我们使用这个代码段,包处理其余部分
应用程序使用(cors()) 如果有其他人遇到这种情况,那么问题根本与CORS无关。api路由中的return语句放错了位置,导致请求超时。很奇怪,控制台中的错误是关于CORS的,但事实是…您尝试过http吗?不是https?可能是您的问题与HttpSt有关谢谢您的建议,但仍然是相同的错误。我也尝试了该片段(即使它允许从任何网站进行不受限制的访问),但错误仍然是相同的。请查看我编辑的答案谢谢您的建议,但尝试后,错误仍然是相同的。好的,很高兴帮助您查看。你也可以分享,如果这有帮助或你找到了它
app.use(cors(credentials: true));
app.use(function (req, res, next) {
res.header("Access-Control-Allow-Credentials", true);
res.header("Access-Control-Allow-Methods", "GET,POST");
res.header(
"Access-Control-Allow-Headers",
"X-Requested-With, X-HTTP-Method-Override, Content- Type, Accept"
);
let allowedOrigins = [
"http://your app.com", ..add more ];
const origin = req.headers.origin;
if (allowedOrigins.includes(origin)) {
res.setHeader("Access-Control-Allow-Origin", origin);
}
if (req.method === "OPTIONS") {
res.sendStatus(200);
} else {
next();
}
});