我正在尝试使用带有 Node.js 的 Socket.io 将 Aws Lambda 用于我的应用程序。
由于 lambda 上的 websocket 限制,我决定使用 http 轮询,但是当客户端执行第一个接收 SID 的请求时,在第二个请求中,服务器抛出Session id unknown
,因为触发了另一个实例并且没有该用户在内存中。
我尝试将socket.io-redis
其用作 socket.io 的 redis 适配器,我尝试使用express-session
and共享 redis 上的会话,express-socket.io-session
但没有任何效果。
在我的 server.js 上,我有:
io.adapter(
redisAdapter({
host: REDIS_URL,
port: REDIS_PORT,
requestsTimeout: 5000
})
);
var redisStoreInstance = new RedisStore({
host: REDIS_URL,
port: REDIS_PORT,
client: redis
});
var sessionMiddleware = session({
store: redisStoreInstance,
secret: "secret",
resave: true,
saveUninitialized: true
});
io.use(sharedsession(sessionMiddleware, {
autoSave:true
}));
io.sockets.on('connection', (socket) => {
socket.handshake.session.save();
});
分析engine.io(socket.io使用的lib)代码,我看到异常是在哪里抛出的:
if (!this.clients.hasOwnProperty(sid)) {
debug('unknown sid "%s"', sid);
return fn(Server.errors.UNKNOWN_SID, false);
}
而且这个变量clients
没有复杂的实现,只是一个局部变量。
所以,我的问题是:
是否可以使用 socket.io 为多个实例创建共享用户存储? (例如,保存在 redis 上并使 socket.io 找到此 redis 实例的会话 id 而不是内存变量)。
提前致谢。