Приложение React не устанавливает готовность ie в браузере с express -socket.io-сессией - PullRequest
0 голосов
/ 01 марта 2020

Я пытаюсь установить идентификатор сеанса cook ie в своем клиентском приложении реакции. Как-то это не работает, и все, что я получаю, это стандартный сеанс готовить ie в браузере.

С другой стороны, он работает с файлом stati c serve HTML, который создает сокет .io соединение.

Вот мой код на стороне сервера:

var app = require("express")();
var server = require('http').Server(app);
var io = require('socket.io')(server);
let expressSession = require('express-session');
let sharedsession = require("express-socket.io-session");

var path = require('path');

var host = 'process.env.HOST' || '0.0.0.0';
var port = process.env.PORT || 4000;

server.listen(port, host, function () {
  console.log("Server running on: " + host + " : " + port);
});

if (process.env.NODE_ENV === 'production') {
  //Set static folder
  app.use(require('express').static('client/build'));
}

let session = expressSession({
  secret: 'my-secret',
  //store: new redisStore({ host: 'localhost', port: 6379, client: redis, ttl: 260}),
  resave: true,
  saveUninitialized: true,
  cookie: {
    maxAge: 10000,
    httpOnly: true,
    sameSite: true,
    secure: true,
  },
})

app.use(function(req, res, next) {
  res.header('Content-Type', 'application/json;charset=UTF-8')
  res.header('Access-Control-Allow-Credentials', true)
  res.header(
    'Access-Control-Allow-Headers',
    'Origin, X-Requested-With, Content-Type, Accept'
  )
  next()
})
app.use(session);

io.use(sharedsession(session, {
  autoSave: true
}));

io.on('connection', function (socket) {

console.log(`socket with id ${socket.id} connection established`);

socket.handshake.session.userdata = Math.random();
socket.handshake.session.save();

console.log(socket.handshake.sessionID);

client:

let socket = io(serverIP, { autoConnect: false });

useEffect(() => {
  socket.on("connect", () => {
    console.log("Connected");
  });
  socket.open();
}, []);

в простом HTML файле, подобном этому, сессия готовит ie устанавливается:

<script src="/socket.io/socket.io.js"></script>
<script type="text/javascript">
  socket = io();

В обоих случаях используется HTTP. Соединение сокета также устанавливается с обоими вариантами, и io cook ie устанавливается. А приложение реакции создается и обслуживается из папки сборки.

Чего мне не хватать? Спасибо за любой совет!

РЕДАКТИРОВАТЬ С 02.03.2019 :

Как оказалось, ошибка может быть вызвана отсутствующим запросом или чем-то еще. Когда я использую локальный socket.io. js, непосредственно добавленный к HTML, все работает отлично. Если я использую socket.io-клиент, напрямую импортированный из моего приложения реакции или внешнего CDN, это не сработает. Похоже, это работает только после того, как я запросил местный ресурс. Кто-нибудь знает, в чем может быть разница между этими двумя подходами и что может быть причиной такого поведения?

...