首页 > 解决方案 > “请求的资源上不存在 '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 }));

任何关于为什么我仍然会收到此错误的建议将不胜感激。谢谢你。

标签: javascriptnode.jsexpress

解决方案


我发现了这个问题,我在没有有效令牌的情况下发出请求,导致以下 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 中间件之后运行,为什么此响应没有附加适当的标头。无论如何,谢谢大家的帮助。


推荐阅读