发出 GET 请求时没有 CORS 错误,但发出 POST 请求时出现 CORS 错误

Posted

技术标签:

【中文标题】发出 GET 请求时没有 CORS 错误,但发出 POST 请求时出现 CORS 错误【英文标题】:No CORS error when making GET requests, but CORS error when making POST requests 【发布时间】:2022-01-06 22:53:10 【问题描述】:

我有一个与 React 应用交互的 Node/Express 服务器。

我需要发出 POST 和 GET 请求,问题是发出 POST 请求时出现 CORS 错误,通常:

Access to fetch at 'http://localhost:9000/testAPI' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

我在服务器上的响应中指定了 Access-Control-Allow-Origin 标头,但我不确定是否也必须为 POST 请求设置此标头。如果我这样做,它应该指定什么域?

我也不愿意使用诸如 CORS 扩展或 npm 包之类的技巧。我想使用 CORS。

服务器端如下所示:

const express = require("express");
const router = express.Router();

router.get("/", (req, res, next) => 
    console.log(req.url);

    res.setHeader("Access-Control-Allow-Origin", "http://localhost:3000");
    res.send("API is working properly");
);

module.exports = router;

在 React 应用程序中,GET 请求看起来像这样(工作正常):

const res = await fetch('http://localhost:9000/testAPI');

console.log(res);

POST 请求如下所示(抛出 CORS 错误):

const res = await fetch('http://localhost:9000/testAPI', 
    method: 'POST',
    mode: 'cors',
    cache: 'no-cache',
    headers: 
      'Content-Type': 'application/json',
    ,
    body: JSON.stringify( someData: "POST requests are working properly" )
);

我是否需要在 POST 请求中指定一些额外的标头或属性?还是我必须在服务器端修改一些东西?

如果我在上线时不会遇到这个问题,那么我不介意使用像 CORS 扩展这样的 hack。

【问题讨论】:

设置 POST 请求的标头并使用相同的端口 localhost:9000 localhost:3000 是不同的来源 我希望我做对了:const res = await fetch('http://localhost:9000/testAPI', method: 'POST', mode: 'cors', cache: 'no-cache', headers: 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': 'http://localhost:9000' , body: JSON.stringify( someData: "POST requests are working properly" ) );。很遗憾没有工作。如果你想让我做点别的事,请告诉我。 试试'Access-Control-Allow-Origin': '*' 没用。谢谢你 @LucianAnghel 首先:确保您阅读并理解developer.mozilla.org/en-US/docs/Web/HTTP/CORS 【参考方案1】:

你可以使用这个包cors

// Install
npm install cors
yarn add cors
    // server.js 
    const express = require('express');
    const cors = require('cors');
    const app = express();
    
    // global middleware
    app.use(cors());
    // You can use route based middleware too
    router.post("/", cors(), (req, res, next) => 
     // process request & send response to client
    );


【讨论】:

以上是关于发出 GET 请求时没有 CORS 错误,但发出 POST 请求时出现 CORS 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用授权标头发出 GET CORS 请求

从我的本地主机客户端发出请求而没有 cors 错误

向本地nodeJS服务器发出发布请求时出现AngularJS CORS错误

发出多个 Axios 请求导致 CORS 错误

即使没有发出预检请求,也会在 POST 请求中出现 CORS 错误

浏览器向 django 发出 CORS 请求的 OPTIONS 请求,但没有 POST