Как разрешить только одно пользовательское соединение одновременно с Nodejs и Expressjs? - PullRequest
0 голосов
/ 23 января 2019

Мне просто нужно управлять параллелизмом в моем приложении, построенном с nodejs в верхней части инфраструктуры nestjs.

Насколько я знаю, самый простой способ сделать этоконтролирует, что в сети один пользователь сеанса в expressjs жив.

Я не забочусь о безопасности или любых других проблемах, просто хочу знать какмногие пользователи подключены и ограничены только одним сеансом пользователя до срок его сеанса истек .

Вот моя кодовая база

var express = require('express');
var session = require('express-session');
var app = express();

var numConnections = 0;


app.use(session({
    cookieName: 'sessionTest',
    secret: 'eg[isfd-8yF9-7w2315df{}+Ijsli;;to8', 
    cookie: {
      secure: false,
      maxAge: 1000 * 10,
      sameSite: true
    }
}));


app.use((req, res, next) => {
    console.log(req.session.store)
    console.log(req.session.ip)
    console.log(req.session.useragent)
    console.log(req.connection.remoteAddress)
    console.log(req.headers['user-agent'])
    if (numConnections === 0 
        // && req.session
        ) {
        req.session.ip = req.connection.remoteAddress;
        req.session.useragent = req.headers['user-agent'];
        req.session.page_views = 1;
        res.send("Welcome to this page for the first time!");
        numConnections++;
        console.log(req.session);
        next();
    }
    else if (numConnections == 1 &&
        req.session.ip === req.connection.remoteAddress
        && req.session.useragent === req.headers['user-agent']
    ) {
        req.session.page_views++;
        res.send("You visited this page " + req.session.page_views + " times");
        console.log('TEST');
        next();
    } else {
        console.log('There is someone using the app!!!');
        return res.sendStatus(401);
    }

})

app.listen(3001);

Я очень ценю, если кто-то может мне помочь

1 Ответ

0 голосов
/ 23 января 2019

Вы можете использовать магазин, чтобы получить текущее количество открытых сессий. doc говорит, что магазины могут реализовать length и / или all методы.Однако, похоже, что только по умолчанию MemoryStore обрабатывает их.Вы можете посмотреть на все совместимые реализации магазина в нижней части страницы и выбрать ту, которая соответствует вашей среде.

Это , вероятно, (т.е. не проверено) выглядит так:

var session = require('express-session');
var memoryStoreThatWillBeChangedBeforeLiveEnvironment = new MemoryStore();
...
app.use(session({
  ...
  store: memoryStoreThatWillBeChangedBeforeLiveEnvironment
}));

app.use((req, res, next) => {
  memoryStoreThatWillBeChangedBeforeLiveEnvironment.length((err, size) => {
    if (err) return res.status(418).send("I'm a teapot");
    var numConnections = size;
    // call your code here
  })
});

(Совершенно очевидно, что если реализация предлагает только метод all, вы можете сосчитать возвращаемый массив сеансов.)

...