express-session/passport/socketio

328
10 мая 2017, 07:54

Всем привет. Есть такая задача : 1. Есть сервер на express 2. Авторизация на паспорте с локальной стратегией 3. Socket.io

Как я понял, после авторизации паспорт сохраняет экземпляр юзера в req.user, однако как можно эти данные получить при инициализации сокета ? т.е. динамически их передавать для каждого авторизованного. server.js

var express = require('express');
var app = express();
var session = require('./models/session');
var passport = require('passport');
require('./models/auth')(passport);
var router = require('./routes/index'); 
app.use(session);
app.use(passport.initialize());
app.use(passport.session());
var ioServer = require('./models/socket')(app);
ioServer.listen(port, () => {
    console.log('localhost:' + port);
});

session.js

var session = require('express-session');
var config = require('config');
var init = function () {
    return session({
        secret: config.get('Customer.session.secret'),
        key: config.get('Customer.session.key'),
        cookie: config.get('Customer.session.cookie'),
        resave: false,
        unset: 'destroy',
        saveUninitialized: true
    })
};
module.exports = init();

ioServer.js

var redis = require('redis').createClient;
var adapter = require('socket.io-redis');
var config = require('config');
var session = require('../session');
var ioEvents = function (io) {
    io.of('/user-groupchat').on('connection', function (socket) {
        // вот тут как то нужно получить req.user ????
    });
    io.of('/user-messages').on('connection', function (socket) {
        // вот тут как то нужно получить req.user ????
    });
};
var init = function (app) {
    var server = require('http').Server(app);
    var io = require('socket.io')(server);
    io.set('transports', ['websocket']);
    let port = config.get('Customer.redis.port');
    let host = config.get('Customer.redis.host');
    let pubClient = redis(port, host);
    let subClient = redis(port, host, { return_buffers: true, });
    io.adapter(adapter({ pubClient, subClient }));
    io.use((socket, next) => {
        session(socket.request, {}, next);
    });
    ioEvents(io);
    return server;
};
module.exports = init;

Вообщем необходимо кидать события разным юзерам в зависимости от их параметров, посоветуйте мб переделать реализацию, или как мне закинуть в блок инфу из реквеста ?

READ ALSO
Автоматическая запись id в поле БД

Автоматическая запись id в поле БД

В БД имеется таблица со столбцами id и followersИмеется 3 пользователя соответственно с id = 1, 2, 3 и пустыми полями столбца followers

272
Вопросы по MySQL кэшированию

Вопросы по MySQL кэшированию

Неделю назад загрузил базу данных для SuiteCRMВключил кэширование

253
Как это понять атомарные данные не может состоять однотипных элементов

Как это понять атомарные данные не может состоять однотипных элементов

Я читаю книгу Линн Бейли изучаем SQLНа странице 200 есть два правила на пути нормализации таблицы, атомарные данные

269
Обновление последней записи MySQL

Обновление последней записи MySQL

Нужно обновить последнюю запись в таблицеКлючевое поле автоинкрементное

256