El acceso desde el origen 'https://example.com' ha sido bloqueado aunque he permitido https://example.com/
Tengo una aplicación creada con React, Node.js y Socket.io.
Implementé el backend de Node en heroku y el frontend en Netlify.
Sé que los errores de CORS están relacionados con el servidor, pero no importa lo que agregue, simplemente no puede pasar por ese error en la imagen a continuación.
También agregué un script proxy al paquete.json de React como "proxy": "https://googledocs-clone-sbayrak.herokuapp.com/"
Y aquí está mi server.js
archivo;
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.`)
);
y aquí es donde hago la solicitud desde el frontend;
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 */
}
TL;DR
Los orígenes web no contienen una ruta.
En consecuencia, nohttps://googledocs-clone-sbayrak.netlify.app/
es un origen web válido. Suelta esa barra diagonal.
Más detalles sobre el problema.
No se permite barra diagonal en el valor del Origin
encabezado
Según el protocolo CORS (especificado en el estándar Fetch ), los navegadores nunca establecen el Origin
encabezado de la solicitud en un valor con una barra diagonal . Por lo tanto, si una página https://googledocs-clone-sbayrak.netlify.app/whatever
emite una solicitud de origen cruzado, el Origin
encabezado de esa solicitud contendrá
https://googledocs-clone-sbayrak.netlify.app
sin ninguna barra diagonal.
Comparación byte a byte en el lado del servidor
Estás utilizando Socket.IO , que se basa en el paquete Node.js. cors
Ese paquete no establecerá nada Access-Control-Allow-Origin
en la respuesta si el origen de la solicitud no coincide exactamente con origin
el valor de su configuración CORS ( https://googledocs-clone-sbayrak.netlify.app/
).
Poniendolo todo junto
Obviamente,
'https://googledocs-clone-sbayrak.netlify.app' ===
'https://googledocs-clone-sbayrak.netlify.app/'
se evalúa como false
, lo que hace que el cors
paquete no establezca ningún Access-Control-Allow-Origin
encabezado en la respuesta, lo que hace que la verificación CORS falle en su navegador, de ahí el error CORS que observó.
Ejemplo del estándar de recuperación
La sección 3.2.5 del Fetch Standard incluso proporciona un ejemplo esclarecedor de este error,
Access-Control-Allow-Origin: https://rabbit.invalid/
y explica por qué hace que falle la verificación CORS:
Un origen serializado no tiene barra diagonal.