以下问题。我有一个运行 React 应用程序的 Ubuntu Web 服务器。特别是,服务器文件中有两个文件处理网站发出的请求。然而,由于某种原因,无法作为客户端向服务器发出请求。
const express = require('express')
const mysql = require('mysql')
const cors = require('cors')
const bodyParser = require('body-parser');
const app = express()
app.use(cors({
origin: ['*']
}))
app.use(bodyParser.json());
const db = mysql.createConnection({
host: '192.168.178.70',
user: 'webserver',
password: '123',
database: 'lanparty',
port: '3306'
})
app.get('/Ergebnisse', (req, res) => {
console.log("gotRequest")
db.query("SELECT * FROM lanparty.match;", (err, data) => {
if (err) {
console.log(err)
res.json(err)
} else {
res.json(data)
}
})
})
app.listen(30100, () => {
console.log("Listening....")
})
import { useEffect } from "react"
import axios from "axios";
export default function Results() {
useEffect(() => {
console.log("fetching...")
axios.get('http://localhost:30100/Results')
.then(response => response.json())
.then(data => {
console.log("data")
console.log(data)
})
.catch((error) => {
console.error("Error:")
console.log(error)
});
}, [])
return (
<div className="pageDiv">
<h2>Results</h2>
</div>
);
}
如果我直接在浏览器中发出请求(http://192.168.178.70:30100/Results)一切正常,因此 server.js 应该可以工作,但是如果网络服务器是源,则请求会被阻止.确切的错误如下所示:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:30100/Results. (Reason: CORS request did not succeed). Status code: (null).
我几乎尝试了所有添加 Access-Control-Allow-Origin 标头的方法:
res.setHeader("Access-Control-Allow-Origin", "localhost");
的形式
我再次尝试了“*”和“127.0.0.1”但这些都不适合我。
提前感谢您的时间和帮助:)
我不了解 Node.js,但我想我知道你在这里缺少什么:你没有配置你的服务器来响应预检请求。
基本上,当客户端(Results.js)代码尝试发出 CORS 请求时,浏览器将首先触发预检请求。此请求的目的是验证您的服务器是否支持 CORS 以及它支持哪种方法/来源。
注意: 某些浏览器可能需要额外的标头才能接受 CORS 请求。只需阅读控制台日志并向响应添加适当的标头 供您参考:https://fetch.spec.whatwg.org/#http-responses
我曾经遇到过一个问题,主要是 Firefox 浏览器导致的错误。标头、客户端或服务器可能存在问题
// set the headers
app.use(function (req: Request, res: Response, next: NextFunction) {
res.header("Access-Control-Allow-Origin", "http://localhost:5173");
res.header("Access-Control-Allow-Credentials", "true");
res.header("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,OPTIONS");
res.header(
"Access-Control-Allow-Headers",
"Origin,X-Requested-With,Content-Type,Accept,content-type,application/json,Authorization",
);
next();
});
// initialize cors
app.use(cors({ credentials: true, origin: process.env.NODE_ENV !== "http://localhost:5173" : process.env.HOST as string}));
如你所见,我使用了两层设置cors
这在使用 HTTP 客户端时有效,但有时在浏览器中使用它仍然失败
import axios from 'axios';
export const config = {
baseURL: 'http://localhost:5000',
withCredentials: 'include',
timeout: 8000,
headers: {
'Content-Type': 'application/json',
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "GET,PUT,POST,DELETE,PATCH,OPTIONS"
},
};
export const api = create(config);
export default api;
有时浏览器会故意失败您的请求,特别是在处理像PUT请求这样的请求时,因为某些浏览器内置了安全功能。