在nodejs / expressjs中使用RedisStore

时间:2013-11-27 13:38:55

标签: node.js session express redis

我正在尝试访问express中的会话数据,所以我想在配置express时我会尝试声明一个connect-redis会话存储。但是,我不明白为什么这不起作用:

var express = require('express');
var http = require('http');
var RedisStore = require('connect-redis')(express);

var app = express();
app.set('port', process.env.PORT || 3000);
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session({ secret: "keyboard cat", store: new RedisStore }));
//app.use(express.session({ secret: "keyboard cat" }));
app.use(app.router);

app.get('/', function(req, res){
    console.log('/');
    req.session.items = [ 'apple', 'orange' ];
    res.end('items configured');
});

app.get('/items', function(req, res){
    console.log('/items: ', req.session.items);
    var s = JSON.stringify(req.session.items);
    res.end('items: ' + s);
});

var server = http.createServer(app).listen(app.get('port'), function(){
    console.log('Express server listening on port ' + app.get('port'));
});

'/'路由只是使用会话配置项目。

'/ items'路线显示会话中的项目列表。

它使用标准的expressjs会话存储。 它不能使用connect-redis(req.session未定义)

我假设redis商店将在app加载/卸载时被实例化和销毁(或者我是否需要在node / express app之外运行?)

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

如果req.session无法连接到您的Redis服务器,则

RedisStore将被取消定义。所以它没有运行,或者它没有在RedisStore正在寻找它的默认位置上运行(127.0.0.1:6379)。

如果是后者,您可以使用RedisStore构造函数的options参数配置位置。

答案 1 :(得分:1)

试一试。

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");
});

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

答案 2 :(得分:0)

您应该调用RedisStore构造函数(使用())

app.use(express.session({ secret: "keyboard cat", store: new RedisStore()}));