Как сохранить и получить сеанс из Redis

Я пытаюсь интегрировать сеансы Redis в мою систему аутентификации, написанную в узле.js.

мне удалось успешно настроить сервер Redis, connect-redis и сервер Express.

вот моя настройка (только важный бит):

var express = require("express");
var RedisStore = require("connect-redis")(express);
var redis = require("redis").createClient();

app.use(express.cookieParser());
app.use(express.session({
    secret: "thisismysecretkey",
    store: new RedisStore({ host: 'localhost', port: 6379, client: redis })
}));

сейчас... Как на самом деле создать, прочитать и уничтожить сеанс? Я прочитал тонны статей о том, как настроить connect-redis и много вопросов здесь на SO, но я клянусь, что каждый останавливается только на конфигурации и делает не объяснять, как им пользоваться...

Я знаю, что это, вероятно, очень просто, но, пожалуйста, не downvote и просто объяснить :).

3 ответов


это должно быть все, что нужно. Вы получаете доступ к сеансу в обработчиках маршрутов через req.session. Сеансы создаются, сохраняются и уничтожаются автоматически.

Если вам нужно вручную создать новый сеанс для пользователя, позвоните req.session.regenerate().

Если вам нужно сохранить его вручную, вы можете позвонить req.session.save().

Если вам нужно уничтожить его вручную, вы можете позвонить req.session.destroy().

посмотреть подключение документация полный список методы и свойства.


рассмотрим этот код.

var express = require('express');
var redis   = require("redis");
var session = require('express-session');
var redisStore = require('connect-redis')(session);
var bodyParser = require('body-parser');
var client  = redis.createClient();
var app = express();

app.set('views', __dirname + '/views');
app.engine('html', require('ejs').renderFile);

app.use(session({
    secret: 'ssshhhhh',
    // create new redis store.
    store: new redisStore({ host: 'localhost', port: 6379, client: client,ttl :  260}),
    saveUninitialized: false,
    resave: false
}));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));

app.get('/',function(req,res){  
    // create new session object.
    if(req.session.key) {
        // if email key is sent redirect.
        res.redirect('/admin');
    } else {
        // else go to home page.
        res.render('index.html');
    }
});

app.post('/login',function(req,res){
    // when user login set the key to redis.
    req.session.key=req.body.email;
    res.end('done');
});

app.get('/logout',function(req,res){
    req.session.destroy(function(err){
        if(err){
            console.log(err);
        } else {
            res.redirect('/');
        }
    });
});

app.listen(3000,function(){
    console.log("App Started on PORT 3000");
});

поэтому вам нужно установить connect-redis и экспресс-сеанс!--6--> экземпляр.

затем в middleware инициализируйте redisStore с такими деталями сервера.

app.use(session({
    secret: 'ssshhhhh',
    // create new redis store.
    store: new redisStore({ host: 'localhost', port: 6379, client: client,ttl :  260}),
    saveUninitialized: false,
    resave: false
})); 

Я положил ttl до 260, вы можете увеличить. После того, как TTL достигнет своих пределов, он автоматически удалит ключ redis.

в маршрутизаторах вы можете использовать req.переменная сеанса для установки, изменения или уничтожения сессия.

еще одна вещь...

Если вы хотите пользовательский cookie i.e не так же, как в вашем магазине Redis вы можете использовать cookie-parser чтобы установить секреты cookie.

надеюсь, что это помогает.

ссылка:https://codeforgeek.com/2015/07/using-redis-to-handle-session-in-node-js/


вы также можете использовать инструмент Redis monitor, чтобы увидеть все действия в режиме реального времени! При обновлении приложения вы увидите данные, отображаемые в окне консоли.

redis-cli monitor

пример вывода для сеансов с использованием tj / connect-redis

1538704759.924701 [0 unix:/tmp/redis.sock] "expire" "sess:F9x-YgbgXu1g7RG8tFlkwY3RV0JzHgCh" "3600"
1538704759.131285 [0 unix:/tmp/redis.sock] "get" "sess:F9x-YgbgXu1g7RG8tFlkwY3RV0JzHgCh"
1538704787.179318 [0 unix:/tmp/redis.sock] "set" "sess:Hl3LPbOBdKO44SG4zQHFn2gfdiWTwzWW" "{\"cookie\":{\"originalMaxAge\":3600000,\"expires\":\"2018-10-05T02:59:47.178Z\",\"secure\":true,\"httpOnly\":true,\"domain\":\".indospace.io\",\"path\":\"/\"},\"path\":\"/\",\"userAgent\":{\"family\":\"NewRelicPingerBot\",\"major\":\"1\",\"minor\":\"0\",\"patch\":\"0\",\"device\":{\"family\":\"Other\",\"major\":\"0\",\"minor\":\"0\",\"patch\":\"0\"},\"os\":{\"family\":\"Other\",\"major\":\"0\",\"minor\":\"0\",\"patch\":\"0\"}},\"ip\":\"184.73.237.85\",\"page_not_found_count\":0,\"city\":\"Ashburn\",\"state\":\"VA\",\"city_state\":\"Ashburn, VA\",\"zip\":\"20149\",\"latitude\":39.0481,\"longitude\":-77.4728,\"country\":\"US\"}" "EX" "3599"
1538704787.179318 [0 unix:/tmp/redis.sock] "set" "sess:Hl3LPbOBdKO44SG4zQHFn2gfdiWTwzWW" "{\"cookie\":{\"originalMaxAge\":3600000,\"expires\":\"2018-10-05T02:59:47.178Z\",\"secure\":true,\"httpOnly\":true,\"domain\":\".indospace.io\",\"path\":\"/\"},\"path\":\"/\",\"userAgent\":{\"family\":\"NewRelicPingerBot\",\"major\":\"1\",\"minor\":\"0\",\"patch\":\"0\",\"device\":{\"family\":\"Other\",\"major\":\"0\",\"minor\":\"0\",\"patch\":\"0\"},\"os\":{\"family\":\"Other\",\"major\":\"0\",\"minor\":\"0\",\"patch\":\"0\"}},\"ip\":\"184.73.237.85\",\"page_not_found_count\":0,\"city\":\"Ashburn\",\"state\":\"VA\",\"city_state\":\"Ashburn, VA\",\"zip\":\"20149\",\"latitude\":39.0481,\"longitude\":-77.4728,\"country\":\"US\"}" "EX" "3599"