socket.io和express之间的共享会话无法在远程服务器上运行

时间:2018-04-23 00:38:23

标签: node.js express session socket.io

首先,这就是我分享会话的方式。它基本上遵循this线程中的实现。

var sessionMiddleware = session({
  name: 'websiteName.sess',
  store: new RedisStore({
    client: redisClient,
    ttl: 60*60*24*7,
    db: 2 
  }),
  secret: 'secredCode',
  saveUninitialized: false,
  resave: true
});


io.use(function(socket, next) {
  sessionMiddleware(socket.request, socket.request.res, next);
});

// Express Session
app.use(sessionMiddleware);

此解决方案适用于localhost。但是,当我在远程AWS服务器上运行Express应用程序时,会话数据不会被共享。作为一个注释,我使用的是elasticache redis,作为redis客户端。

将用户ID保存到快速会话后,这就是会话对象的样子。

req.session:

{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"flash":{},"userId":"8ad5dce4b600xxxxxxxxx"}

socket.request.session:

{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"}}

我非常确定问题不在于用户ID访问服务器时会话数据未保存,因为用户ID已保存在会话中。

为什么会这样?他们是修复吗?

编辑: 这是我与socket.io的客户端连接:

  var socket = io.connect('http://ip.ad.dr.ess:80');

1 个答案:

答案 0 :(得分:1)

将我的评论写入答案,因为它似乎解决了您的问题:

您需要确保浏览器的网址栏中的地址与http://ip.ad.dr.ess:80完全相同的主机/端口?如果没有,那么socket.io和网页将不会共享cookie,因此你会错过会话cookie。