Reactjs React应用程序未使用express-socket.io-session在浏览器中设置cookie

Reactjs React应用程序未使用express-socket.io-session在浏览器中设置cookie,reactjs,cookies,socket.io,express-session,Reactjs,Cookies,Socket.io,Express Session,我正在尝试在客户端应用程序上设置会话id cookie。不知何故,这不起作用,我得到的只是浏览器中的标准io会话cookie 另一方面,它使用静态服务的HTML文件,该文件建立了socket.io连接 以下是我的服务器端代码: var app = require("express")(); var server = require('http').Server(app); var io = require('socket.io')(server); let expressSession = re

我正在尝试在客户端应用程序上设置会话id cookie。不知何故,这不起作用,我得到的只是浏览器中的标准io会话cookie

另一方面,它使用静态服务的HTML文件,该文件建立了socket.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);
客户:

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

useEffect(() => {
  socket.on("connect", () => {
    console.log("Connected");
  });
  socket.open();
}, []);
在这样一个简单的HTML文件上,设置会话cookie:

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

socket=io();
这两种情况都是通过HTTP实现的。还可以使用这两个变量建立套接字连接,并设置io cookie。react应用程序是从build文件夹构建和提供的

我会错过什么?谢谢你的建议

从2019年3月2日起编辑:


事实证明,错误可能是由于缺少请求或其他原因造成的。当我使用直接添加到HTML的本地socket.io.js时,一切正常。如果我使用直接导入我的react应用程序或外部CDN的socket.io-client,它将无法工作。似乎只有在我向本地资源发出请求后,它才起作用。任何人都知道这两种方法之间的区别以及这种行为的原因是什么?

找到了解决方案吗?@jidu0106正如我在编辑中所说的,我修复了套接字请求之前的正常HTTP请求的问题。我认为这个问题和解决方案可能是个人的。