【问题标题】:Why CORS in Express allowing all requests although I alllowed only GET in allowed method为什么 Express 中的 CORS 允许所有请求,尽管我在允许的方法中只允许 GET
【发布时间】:2021-03-21 12:48:10
【问题描述】:

我正在学习使用 Node.js、Express 和 MongoDB 实现 API。我处于早期学习阶段。我已将使用 npm i cors 的 cors 包添加到项目中。我在我的项目中使用cors 作为中间件,如下所示。

const express = require("express");
const app = express();
const cors = require("cors");
const mongojs = require("mongojs");

const { body, param, validationResult } = require("express-validator");

const db = mongojs("travel", ["records"]);

const bodyParser = require("body-parser");

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.use(
  cors({
    origin: ["http://a.com", "http://b.com"],
    methods: ["GET"],
    allowHeaders: ["Authorization", "Content-Type"],
  })
);

app.get("/api/records", cors(corsOptions), function (req, res) {
  db.records.find(function (err, data) {
    if (err) {
      return res.sendStatus(500);
    } else {
      return res.status(200).json({
        meta: { total: data.length },
        data,
      });
    }
  });
});

app.post(
  "/api/records",
  [
    body("name").not().isEmpty(),
    body("from").not().isEmpty(),
    body("to").not().isEmpty(),
  ],
  function (req, res) {
    const errors = validationResult(req);

    if (!errors.isEmpty()) {
      return res.status(400).json({ errors: errors.array() });
    }

    db.records.insert(req.body, function (err, data) {
      if (err) {
        return res.status(500);
      }

      const _id = data._id;
      res.append("Location", "/api/records/" + _id);
      return res.status(201).json({
        meta: { _id },
        data,
      });
    });
  }
);

app.listen(8000, function () {
  console.log("Server running at port 8000...");
});

我只在允许的方法中添加了GET 请求。但是当我尝试POST 新记录时,它工作正常。此外,我只在主机列表中添加了"http://a.com", "http://b.com",但来自 localhost 的所有请求都正常工作。请让我知道我在这里缺少什么。非常感谢。

【问题讨论】:

  • 您从哪种类型的客户端进行 POST?它来自浏览器吗?或者来自其他一些 http 客户端。 CORS 保护仅在浏览器中实施和执行。此外,您的请求是否真正跨源,因为请求来自与您用于访问 POST 请求不同来源的网页?
  • 我使用 Insomnia 作为客户端。 “CORS 保护仅在浏览器中实施和执行”。著名的。我想这不是真正的跨源,因为我使用的是 localhost。

标签: node.js api express cors


【解决方案1】:

根据您的问题和您随后的评论,听起来这里发生了几件事:

  1. CORS 保护仅由实际的浏览器引擎强制执行。如果您从非浏览器客户端发出请求,则没有 CORS 限制。

  2. 要从浏览器触发 COR 保护,您必须进行实际的跨源调用。如果一切都在localhost 上,那么就不会是跨域的。

【讨论】:

  • 非常感谢您的解释。
猜你喜欢
  • 2015-03-09
  • 1970-01-01
  • 2017-01-04
  • 2023-04-02
  • 2020-12-29
  • 2020-05-25
  • 2016-12-12
  • 2020-04-05
  • 2023-03-10
相关资源
最近更新 更多