was*_*low 5 javascript node.js cors reactjs
我有一个用 React、Node.js 和 Socket.io 制作的应用程序,
我将 Node 后端部署到 heroku ,前端部署到 Netlify
这是我的server.js文件;
const mongoose = require('mongoose');
const Document = require('./Document');
const dotenv = require('dotenv');
const path = require('path');
const express = require('express');
const http = require('http');
const socketio = require('socket.io');
dotenv.config();
const app = express();
app.use(cors());
const server = http.createServer(app);
const io = socketio(server, {
cors: {
origin: 'https://googledocs-clone-sbayrak.netlify.app/',
methods: ['GET', 'POST'],
},
});
app.get('/', (req, res) => {
res.status(200).send('hello!!');
});
const connectDB = async () => {
try {
const connect = await mongoose.connect(process.env.MONGODB_URI, {
useUnifiedTopology: true,
useNewUrlParser: true,
});
console.log('MongoDB Connected...');
} catch (error) {
console.error(`Error : ${error.message}`);
process.exit(1);
}
};
connectDB();
let defaultValue = '';
const findOrCreateDocument = async (id) => {
if (id === null) return;
const document = await Document.findById({ _id: id });
if (document) return document;
const result = await Document.create({ _id: id, data: defaultValue });
return result;
};
io.on('connection', (socket) => {
socket.on('get-document', async (documentId) => {
const document = await findOrCreateDocument(documentId);
socket.join(documentId);
socket.emit('load-document', document.data);
socket.on('send-changes', (delta) => {
socket.broadcast.to(documentId).emit('receive-changes', delta);
});
socket.on('save-document', async (data) => {
await Document.findByIdAndUpdate(documentId, { data });
});
});
console.log('connected');
});
server.listen(process.env.PORT || 5000, () =>
console.log(`Server has started.`)
);
Run Code Online (Sandbox Code Playgroud)
这就是我向前端发出请求的地方;
import Quill from 'quill';
import 'quill/dist/quill.snow.css';
import { useParams } from 'react-router-dom';
import { io } from 'socket.io-client';
const SAVE_INTERVAL_MS = 2000;
const TextEditor = () => {
const [socket, setSocket] = useState();
const [quill, setQuill] = useState();
const { id: documentId } = useParams();
useEffect(() => {
const s = io('https://googledocs-clone-sbayrak.herokuapp.com/');
setSocket(s);
return () => {
s.disconnect();
};
}, []);
/* below other functions */
/* below other functions */
/* below other functions */
}
Run Code Online (Sandbox Code Playgroud)
Web 源不包含路径。
因此,https://googledocs-clone-sbayrak.netlify.app/不是有效的Web 来源。删除末尾的斜杠。
Origin标头值中不允许出现尾部斜杠根据 CORS 协议(在Fetch 标准中指定),浏览器永远不会将请求标头设置Origin为带有尾部斜杠的值。因此,如果页面https://googledocs-clone-sbayrak.netlify.app/whatever发出跨源请求,该请求的Origin标头将包含
https://googledocs-clone-sbayrak.netlify.app
Run Code Online (Sandbox Code Playgroud)
没有任何尾部斜杠。
您正在使用Socket.IO,它依赖于Node.jscors包。Access-Control-Allow-Origin如果请求的来源与您的 CORS 配置值不完全匹配,则该包不会在响应中设置任何内容origin(https://googledocs-clone-sbayrak.netlify.app/。
明显地,
'https://googledocs-clone-sbayrak.netlify.app' ===
'https://googledocs-clone-sbayrak.netlify.app/'
Run Code Online (Sandbox Code Playgroud)
计算结果为false,这会导致cors包不在响应中设置任何Access-Control-Allow-Origin标头,从而导致浏览器中的 CORS 检查失败,因此出现您观察到的 CORS 错误。
Fetch 标准的 3.2.5 节甚至提供了一个关于此错误的启发性示例,
Access-Control-Allow-Origin: https://rabbit.invalid/
Run Code Online (Sandbox Code Playgroud)
并解释了为什么它会导致 CORS 检查失败:
序列化源没有尾部斜杠。
| 归档时间: |
|
| 查看次数: |
1858 次 |
| 最近记录: |