从源“http://localhost:3000”访问“http://localhost:5000/api/products”的 XMLHttpRequest 已被 CORS 策略阻止:无“访问控制”
Posted
技术标签:
【中文标题】从源“http://localhost:3000”访问“http://localhost:5000/api/products”的 XMLHttpRequest 已被 CORS 策略阻止:无“访问控制”【英文标题】:Access to XMLHttpRequest at 'http://localhost:5000/api/products' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Contr 【发布时间】:2021-12-26 04:27:24 【问题描述】:我正在尝试通过邮递员使用 axios 获取在 db 上创建的数据,但我一直没有收到访问控制 cors 错误。我已将“Moesif Origin & CORS Changer”插件添加到我的 chrome 中,但仍然没有解决方案。我在服务器上需要 cors 我得到了同样的问题。我不知道我做错了什么。我已经阅读并尝试了这里给出的几种解决方案。
我的客户端代码(React.JS)
import styled from "styled-components";
import popularProducts from "../data";
import Product from "./Product";
import axios from "axios";
import useState, useEffect from "react";
const Container = styled.div`
padding: 20px;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
`;
const Products = ( cat, filter, sort ) =>
const [products, setProducts] = useState([]);
const [filteredProducts, setFilteredProducts] = useState([]);
useEffect(() =>
const getProducts = async () =>
try
const res = axios.get("http://localhost:5000/api/products");
console.log(res);
catch (err)
;
getProducts();
, [cat]);
我的后端 API(Express)
const express = require("express");
const app = express();
const mongoose = require("mongoose");
const dotenv = require("dotenv");
const userRoute = require("./routes/user");
const authRoute = require("./routes/auth");
const productRoute = require("./routes/product");
const cartRoute = require("./routes/cart");
const orderRoute = require("./routes/order");
const cors = require("cors");
dotenv.config();
mongoose
.connect(process.env.MONGO_URL)
.then(() => console.log("DB connection successful"))
.catch((error) =>
console.log(error);
);
//middleware
app.use(express.json());
app.use("/api/auth", authRoute);
app.use("/api/users", userRoute);
app.use("/api/products", productRoute);
app.use("/api/carts", cartRoute);
app.use("/api/orders", orderRoute);
app.use(cors());
app.listen(process.env.PORT || 5000, () =>
console.log("Backend server is running");
);
【问题讨论】:
【参考方案1】:首先,检查cors版本,如果不行,请尝试使用代理。
您可以使用如下代理,
在您的前端,pacakge.json 只需添加这行代码。
"proxy": "http://localhost:5000",
然后在你的 Axios.get 中删除 http://localhost:5000 和
axios.get("http://localhost:5000/api/products");
相反,这样做
const res = axios.get("/api/products");
如果两者都不起作用,请尝试在您的服务器端安装和导入 body-parser。
installtion:
npm i body-parser
import:
const bodyParser = require('body-parser')
【讨论】:
【参考方案2】:问题是您将cors
中间件包含在中间件堆栈的底部 中,因此只有在没有任何路由匹配时才能到达它,即您的 404 错误会有 CORS标题,但没有别的:
app.use("/api/auth", authRoute);
app.use("/api/users", userRoute);
app.use("/api/products", productRoute); // This route handles the request
// and ENDS the request processing
app.use("/api/carts", cartRoute);
app.use("/api/orders", orderRoute);
app.use(cors()); // This is never reached!
您需要 CORS 标头总是,因此您必须将中间件放在堆栈的 顶部:
app.use(cors()); // This is executed first, adds the
// headers and continues processing
app.use("/api/auth", authRoute);
app.use("/api/users", userRoute);
app.use("/api/products", productRoute); // This route handles the request
app.use("/api/carts", cartRoute);
app.use("/api/orders", orderRoute);
【讨论】:
谢谢。我打开了 Moesif Origin 和 Core Changer,一切正常。我意识到它从来没有在整个时间。我现在可以看到我的数据了。【参考方案3】:尝试在客户端的 src 文件夹中创建一个名为 setupProxy.js 的文件。 安装http-setup-proxy
将此添加到 setupProxy.js:
const createProxyMiddleware = require('http-proxy-middleware')
module.exports = function (app)
app.use(
'/api',
createProxyMiddleware(
target: 'http://localhost:5000',
changeOrigin: true,
),
)
最后,重新启动您的应用程序。
【讨论】:
以上是关于从源“http://localhost:3000”访问“http://localhost:5000/api/products”的 XMLHttpRequest 已被 CORS 策略阻止:无“访问控制”的主要内容,如果未能解决你的问题,请参考以下文章
CORS 策略已阻止从源“http://localhost:3000”访问“http://localhost:8000/api/puppies”获取
从源“http://localhost:3000”访问“http://127.0.0.1:5000/product”处的 XMLHttpRequest
从源“http://localhost:3000”访问“http://localhost:5000/api/products”的 XMLHttpRequest 已被 CORS 策略阻止:无“访问控制”
从源“http://localhost:3000”访问“https://***”处的 XMLHttpRequest 已被 CORS 策略阻止
CORS 策略已阻止从源“http://localhost:3000”访问“http://localhost:9900/jaxrs-post-example/rest/customers”获取
CORS 策略已阻止从源“http://localhost:3000”访问“https://randomuser.me/api/?results=4”获取: