javascript - “请求的资源上不存在 'Access-Control-Allow-Origin' 标头”错误,即使我有适当的 CORS 中间件
问题描述
即使我的快速服务器中有以下中间件(位于所有其他中间件之前),我仍不断收到“请求的资源上不存在'Access-Control-Allow-Origin'标头”错误:
const express = require("express");
const app = express();
const bodyParser = require("body-parser");
const PORT = process.env.PORT || 5000;
const cors = require("cors");
const workoutRoutes = require("./routes/workoutRoutes");
const exerciseRoutes = require("./routes/exerciseRoutes");
const userRoutes = require("./routes/userRoutes");
const checkAuth = require("./middleware/check-auth");
app.use(function (req, res, next) {
res.setHeader("Access-Control-Allow-Origin", "*");
res.setHeader(
"Access-Control-Allow-Methods",
"GET, POST, OPTIONS, PUT, PATCH, DELETE"
);
res.setHeader(
"Access-Control-Allow-Headers",
"X-Requested-With,content-type, Authorization"
);
res.setHeader("Access-Control-Allow-Credentials", true);
next();
});
app.use("/users", userRoutes);
app.use(checkAuth);
app.use("/workouts", workoutRoutes);
app.use("/exercises", exerciseRoutes);
app.listen(PORT);
我知道这个问题已被多次问过,但没有一个解决方案对我有用,包括使用 cors npm 包。
这是我尝试使用 cors 模块的替代中间件,它会产生相同的错误:
app.options("*", cors());
app.use(cors({ origin: null }));
任何关于为什么我仍然会收到此错误的建议将不胜感激。谢谢你。
解决方案
我发现了这个问题,我在没有有效令牌的情况下发出请求,导致以下 checkAuth 中间件以“无有效令牌”响应。
const jwt = require("jsonwebtoken");
module.exports = (req, res, next) => {
try {
const token = req.headers.authorization;
if (!token) {
res.send("No valid token");
}
next();
} catch (error) {
console.log(error);
return;
}
};
我仍然不明白的是,如果 checkAuth 中间件在 cors 中间件之后运行,为什么此响应没有附加适当的标头。无论如何,谢谢大家的帮助。
推荐阅读
- node.js - 通过代码使用 CRUD 和查询之间有什么区别吗?
- angular - 角度测试:将 fakeAsync 与 async/await 结合使用
- java - Spring Boot GET Request 给出 200 OK 状态,但 Postman 返回“ø”作为响应正文
- google-sheets - 从 google 表格中获取 10 个值到我的 mit 应用程序发明者应用程序
- python - 如何使用 python/beautifulsoup 向 degiro.nl 提交登录信息?
- r - 带条件的数字序列(续)。data.table 解决方案?
- python - 仅将装饰器应用于类属性
- c# - 在尊重控制反转的同时在 .NET Core 中使用依赖注入
- spring - spring-boot-starter-data-elasticsearch 导致未知设置 analyzer/search_analyzer 和 index.settings.analysis.analyzer.autocomplete
- heroku - 拒绝从 <> 应用样式,因为它的 MIME 类型 ('text/html') 不是受支持的样式表 MIME 类型,并且启用了严格的 MIME 检查