Не удается установить связь с сокетами между react и express js

#node.js #reactjs #express #socket.io #react-redux

#node.js #reactjs #экспресс #socket.io #react-redux

Вопрос:

Я объявляю сокет в app.js (серверная часть) следующим образом

 var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
const cors = require('cors');
var indexRouter = require('./routes/index');
var usersRouter = require('./usersdata/users.controller');

var app = express();
//To start the app set DEBUG=api:* amp; npm start
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(cors());


// Socket IO Require and object creation
const server = require('http').createServer(app);
const io = require('socket.io')(server, {pingTimeout: 60000});
const profileDataSocket=require('./sockets/profileDataSocket')
profileDataSocket(io);

  

profileDataSocket объявлен следующим образом:-

 const profileDataSocket = (io) => {
    io.on('connection', (socket) => {
      const con = new conService(io, socket);
      console.log('creating connection')
      socket.on(ON_PUSH_LOCATION, con.push_Location);
  
      socket.on('disconnect', ()=> {
      });
    });
  };
  
  module.exports = profileDataSocket;
  

и в react я использую сокет таким образом:-

 onSubmit() {
    console.log(this.state.formState.occupation);
    this.socket.emit('push message',{
      message:'Hello socket'
    })
    console.log('socket emmited');
  }
  

в react я объявляю клиент сокета, используя:-

  constructor(props) {
    super(props);
    this.onSubmit = this.onSubmit.bind(this);
    this.socket = io('http://localhost:9000')
  }
  

Но я получаю ошибку таким образом:-
Доступ к XMLHttpRequest по адресу ‘http://localhost:9000/socket.io/?EIO=3amp;transport=pollingamp;t=NGVteci ‘из источника’http://localhost:3000 ‘ заблокирован политикой CORS: значение заголовка ‘Access-Control-Allow-Origin’ в ответе не должно быть шаблоном ‘*’, когда режим учетных данных запроса ‘include’. Режим учетных данных запросов, инициируемых XMLHttpRequest, контролируется атрибутом withCredentials

Примечание: —Мой узел работает на порту 9000, а react работает на порту 3000

Ответ №1:

Проблема, с которой вы столкнулись, заключается в политике CORS. Источник должен соответствовать заголовку Access-Control-Allow-Origin. Здесь для получения дополнительной информации: CORS

Также в express.js в репозитории вы можете найти несколько примеров: Настройка Cors — Express.js

Чтобы решить проблему, я бы сделал:

 const origin = 'http://localhost:9000'
app.use(cors({origin}))
  

Примечание: Я бы использовал origin переменную в качестве переменной окружения как: process.env['allowed_origin']

Комментарии:

1. Нет, все еще я получаю ту же проблему