Сокет.приложение ввода-вывода работает локально, но не на Heroku

#node.js #reactjs #heroku #socket.io

#node.js #reactjs #heroku #socket.io

Вопрос:

Я создаю приложение React и сервер узлов, которые должны взаимодействовать друг с другом через сокеты, используя socket.io . Когда у меня все подключено на моем локальном компьютере, у меня не возникает никаких проблем. Однако, когда я использую свой развернутый сервер, мое приложение React выдает следующую ошибку в консоли:

 Access to XMLHttpRequest at 'https://{URL TO MY HEROKU SERVER}/socket.io/?EIO=4amp;transport=pollingamp;t=NNjgExO' 
from origin '{URL FOR MY HEROKU REACT APP}' has been blocked by CORS policy: 
Response to preflight request doesn't pass access control check: 
The 'Access-Control-Allow-Origin' header contains the invalid value '48506'.
 

Я столкнулся с аналогичной проблемой локально при сборке приложения и узнал, что мне нужно использовать cors на моем сервере, чтобы разрешить подключения. Когда я сделал это на своей локальной машине, это сработало. Однако теперь, когда я его развернул, я снова получаю ошибку такого типа. Я знаю, что для этого есть какие-то настройки cors, которые мне нужно изменить, но я действительно не знаю, что нужно изменить.
Вот код сервера:

 const server = http.createServer(app);
const io = socketio(server, {
  cors: {
    allRoutes: true,
    origin: PORT,
    methods: ["GET", "POST"],
    allowedHeaders: ["my-custom-header"],
    credentials: true,
  },
});
 

И вот код приложения React для подключения:

 socket = io(ENDPOINT, {
      withCredentials: true,
      extraHeaders: {
        "my-custom-header": "abcd",
      },
    });
 

EDNPOINT ссылается либо на мой локальный сервер, либо на URL для развернутого сервера, в зависимости от среды, в которой я работаю. Любая помощь будет оценена!

Ответ №1:

Мне удалось выяснить настройки cors методом проб и ошибок. Для всех, кому интересно, ниже приведены настройки, которые работают для меня:

Сервер:

 const cors = require("cors");
const socketio = require("socket.io");

const app = express();
app.use(cors());

const server = http.createServer(app);

const io = socketio(server, {
  cors: {
    origin: "*",
    methods: ["GET", "POST"],
    allowedHeaders: ["content-type"],
  },
});
 

Клиент:

 socket = io(ENDPOINT);