socket.io с адаптером redis на express.js: как перенести все сокеты в комнату? - PullRequest
2 голосов
/ 16 мая 2019

Я хочу перенести сеанс всех сокетов в комнату.

Я поделился express-session с сеансом socket.io с express-socket.io-session.

Мой сервер:

import * as sharedsession from 'express-socket.io-session';
import * as session from 'express-session';
import * as connectRedis from 'connect-redis';
import * as express from 'express';
import * as SocketIO from 'socket.io';
import * as redisSocket from 'socket.io-redis';

// redis optinon
const redisOption = { port: 'XXX' };


// express.js
const app = express();

// create the redis store for the express session
const RedisStore = connectRedis(session);
const expressSession = session({
      name: 'SESSIONID',
      store: new RedisStore(redisOption),
      secret: 'as54f6a65sf4fa',
      resave: false,
      saveUninitialized: false,
      cookie: { secure: true }
});
// set the session into express
app.use(expressSession);


// socket.io
const io = SocketIO(httpServer, {path: '/api/socket.io', origins: '*:*'});
// se the adapter for socket io
io.adapter(redisSocket(redisOption));
// share the express session with socket io
io.use(sharedsession(expressSession, {autoSave: true}));

// just for test, join all socket into a room 'foo'
io.on('connection', (client) => {
    client.join('foo');
});


// start the express server
app.listen(3000);

Моя попытка вернуть сеанс пользователя в комнату:

io.in('foo').clients((err, clients) => {
    for (let i = 0, e = clients.length; i < e; i++) {
        const client = clients[i]; // socket id
        // HOW GET THE SOCKET SESSION?
    }
});

я тоже пробовал

// this works only for the current instance, don't return all sockets into the redis adapter
const sockets = io.sockets.adapter.rooms['foo'].sockets;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...