0

我正在尝试使用带有 Node.js 的 Socket.io 将 Aws Lambda 用于我的应用程序。

由于 lambda 上的 websocket 限制,我决定使用 http 轮询,但是当客户端执行第一个接收 SID 的请求时,在第二个请求中,服务器抛出Session id unknown,因为触发了另一个实例并且没有该用户在内存中。

我尝试将socket.io-redis其用作 socket.io 的 redis 适配器,我尝试使用express-sessionand共享 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 而不是内存变量)。

提前致谢。

4

0 回答 0