【问题标题】:Node.js Express sessions using connect-redis with Unix Domain Sockets使用带有 Unix 域套接字的 connect-redis 的 Node.js Express 会话
【发布时间】:2014-02-20 11:01:31
【问题描述】:

我正在尝试使用 connect-redis 来利用基于 Redis 的会话存储,通过 UNIX 域套接字进行通信。

有这个:Redis Connection via socket on Node.js 但答案是特定于 node-redis,而不是 connect-redis 用于 Redis 会话存储。

我认为通过使用并传入 'client' 参数创建我自己的 node-redis 对象会很容易让事情顺利进行,如 ' README 的选项部分在这里:https://github.com/visionmedia/connect-redis

但是,当我这样做时,req.session 参数永远不会在 Express 应用程序上设置。

var Redis = require('redis');
var RedisStore = require('connect-redis')(express);
var redis = Redis.createClient(config['redis']['socket']);

还有会话组件:

app.use(express.session({
    store: new RedisStore({client: redis})
}));

我错过了什么吗?

【问题讨论】:

  • 您在express.cookieParser() 中链接了吗?没有它,会话将无法工作(必须有某种方法来存储会话 ID,通常在 cookie 中)
  • 是的。道歉;我将所有内容简化为我认为适用的内容。如果你从 RedisStore 中删除“client:redis”,我实际上有一个工作设置。
  • 此外,“redis-cli -s /tmp/redis.sock”确实有效,尽管我第一次尝试时遇到了文件系统权限问题。修复这些没有帮助。
  • (点头)只是检查...Express 中间件文档并不总是能很好地指定依赖关系。好吧,一切看起来都是对的,恐怕我现在没有时间深入研究它......我稍后会尝试回到这个问题。

标签: node.js session express redis unix-socket


【解决方案1】:

看起来你做的一切都是正确的......我整理了一个小的概念验证,它对我有用。这是我的完整代码:

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

var redisClient = redis.createClient( 17969, '<redacted>.garantiadata.com', 
    { auth_pass: '<redacted>' } );

var app = express();

app.use(express.cookieParser('pure cat flight grass'));
app.use(express.session({ store: new RedisStore({ client: redisClient }) }));
app.use(express.urlencoded());

app.use(app.router);

app.get('/', function(req, res){
    var html = '';
    if(req.session.name) html += '<p>Welcome, ' + req.session.name + '.</p>';
    html += '<form method="POST"><p>Name: ' +
        '<input type="text" name="name"> ' +
        '<input type="submit"></p></form>';
    res.send(html);
});

app.post('/', function(req, res){
    req.session.name = req.body.name;
    res.redirect('/');
});

http.createServer(app).listen(3000,function(){
    console.log('listening on 3000');
});

我正在使用来自 Garantia Data 的免费 Redis 帐户,但这应该会有所作为。你发现我在做什么和你在做什么之间有什么不同吗?

【讨论】:

    猜你喜欢
    • 2013-10-13
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 2014-07-24
    相关资源
    最近更新 更多