@dibanshee

Node.JS как сохранить данные сессии Socket.IO?

Добрый день всем. До этого не работал с Node.JS, но из-за Angular решил попробовать сделать api на нем. В основном сервер будет отвечать на запросы по сокету. Проблема возникла в том, что при каждом обращении angular`а к серверу создается сесиия с новым ID и новая cookie. Если даже ее сохранять в БД методем save() (использую RethinkDB, нужна реактивная БД), все равно создается новая сессия. Если сделать сначала http запрос, то используется сесиия из БД и cookie этого запроса и сесиия не обновляется, в таком случае, можно использовать ее для хранения всего необходимого, но при этом нет обновления maxAge, что тоже не есть хорошо. Складывается такое впечатление, что сокет вообще мимо БД проходит. Подскажите, кто знает, где ошибка в коде.

var session = require('express-session');
var cookie = require('cookie-parser')(process.env.SESSION_SECRET);
var bodyParser = require('body-parser');
var app = require('express')();
var http = require('http').Server(app);
var db = require('./models/db');
var dbModel = new db();
var port = process.env.PORT || 3000;
var morgan = require('morgan');
var postRoute = require('./routes/posts');
require('dotenv/config');

var SESSION_LIFETIME = 1000*60*15  //15 min
var MODE_PRODUCTION = false;

dbModel.setupDb();

var RDBStore = require('express-session-rethinkdb')(session);

app.use(morgan('dev'));
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(cookie);

var sessionMiddleware = session({
  name: 'sid',
  resave: true,
  secret: process.env.SESSION_SECRET,
  saveUninitialized: true,
  rolling: true,
  store: new RDBStore({
    connectOptions: {
      servers: [{host:'localhost', port:28015,}],
      db: "session_db"
    },
    table: "sessions",
    sessionTimeout: SESSION_LIFETIME*100,
    flushInterval: 60000,
    debug: MODE_PRODUCTION
  }),
  cookie: {
    //httpOnly: false,
    //domain: process.env.DOMAIN,
    //name: 'TestIT',
    //sameSite: true,
    maxAge: SESSION_LIFETIME,
    secure: MODE_PRODUCTION
  }
});

app.use(sessionMiddleware);

var io = require('socket.io')(http);

io.use(function(socket, next) {
  cookie(socket.request, socket.request.res, function(err) {
    if (err) return next(err);
    //sessionMiddleware(socket.handshake, {}, next);
    sessionMiddleware(socket.request, socket.request.res, next);
  });
});

app.get('/', (req, res) => {
  console.log(req.sessionID)
  res.sendStatus(200);
 });

app.use('/post', postRoute);

io.on('connection', function(socket) {
  socket.request.session
  console.log('socket.request.sessionID: ', socket.request.sessionID);
  console.log('User connected');
  socket.on( 'disconnect', function() {
    console.log('user disconnected');
  });
});

http.listen(port, function(){
  console.log(`Running the server ${port}`);
});


Кстати, еще интересный момент, если сделать так 'var io = require('socket.io')();' тагда и сессия не пересоздается и в БД сохраняется.
Небольшое дополнение. Если сделать так: socket.io(http, {cookie: 'sid'}), то после http запроса, куки просто переписывается, и сессия опять обновляется, а сохраненная в БД не используется. Если оставить просто (http), то как и говорил сессия считывается с бд, пока не пройдет время maxAge.
На рабочем сервере предпорлогается, что вообще не будет http запрорсов.
Может кто подскажет, где ошибка или может не дописал чего-то? Спасибо.
  • Вопрос задан
  • 45 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы