首先,这就是我分享会话的方式。它基本上遵循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');
答案 0 :(得分:1)
将我的评论写入答案,因为它似乎解决了您的问题:
您需要确保浏览器的网址栏中的地址与http://ip.ad.dr.ess:80完全相同的主机/端口?如果没有,那么socket.io和网页将不会共享cookie,因此你会错过会话cookie。