如何从Redis保存和检索会话

Ele*_*ist 43 session-state redis node.js

我正在尝试将Redis会话集成到我用Node.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 })
}));
Run Code Online (Sandbox Code Playgroud)

现在......我如何实际创建,阅读和销毁会话?我已经阅读了大量关于如何设置的文章connect-redis和关于SO的许多问题,但我发誓每一个都停在配置上,并没有解释如何实际使用它...

我知道这可能非常简单,但请不要downvote,只是解释:).

Joh*_*yHK 28

应该就是它的全部内容.您可以通过路径处理程序访问会话req.session.会话将自动创建,保存和销毁.

如果您需要为用户手动创建新会话,请致电req.session.regenerate().

如果您需要手动保存,可以拨打电话req.session.save().

如果你需要手动销毁它,你可以打电话req.session.destroy().

有关方法和属性的完整列表,请参阅Connect文档.


Sha*_*hid 11

考虑这段代码.

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");
});
Run Code Online (Sandbox Code Playgroud)

因此,您需要安装connect-redis并将快速会话 实例传递给它.

然后在中间件中使用像这样的服务器细节初始化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
})); 
Run Code Online (Sandbox Code Playgroud)

我把ttl改为260,你可以增加.TTL达到极限后,会自动删除redis键.

在路由器中,您可以使用req.session变量来设置,编辑或删除会话.

还有一件事...

如果您想要自定义cookie,即与Redis商店中的不一样,您可以使用cookie-parser来设置cookie秘密.

希望能帮助到你.

链接:https://codeforgeek.com/2015/07/using-redis-to-handle-session-in-node-js/