【问题标题】:Using RedisStore in nodejs / expressjs在 nodejs / expressjs 中使用 RedisStore
【发布时间】:2013-12-13 04:29:00
【问题描述】:

我正在尝试访问 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 存储将在应用加载/卸载时被实例化和销毁(或者我是否需要它在 node/express 应用之外运行?)

有什么想法吗?

【问题讨论】:

  • 在您的问题中添加 node.js 标签以获得更多关注/视图

标签: node.js session express redis


【解决方案1】:

如果RedisStore 无法连接到您的 Redis 服务器,req.session 将未定义。所以它要么没有运行,要么没有在RedisStore 正在寻找它的默认位置(127.0.0.1:6379)上运行。

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

【讨论】:

  • 啊,我以为redis服务器是由节点启动的——我看到它是一个单独的服务器进程。我将使用 expressjs MemoryStore 作为存储,而不是运行新的服务器。
【解决方案2】:

试试这个。

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 不过,我也更喜欢括号。如果只是为了闭嘴jshint ;)
    • 是的 - 更喜欢 () myslef 但从其他地方复制/粘贴代码。
    猜你喜欢
    • 2014-01-12
    • 2014-05-06
    • 1970-01-01
    • 2012-03-05
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 2012-09-09
    相关资源
    最近更新 更多