2014-12-29 104 views
2

我試圖讓快速會話在Redis中存儲會話,但它似乎並不像它想要保存。當我恢復到默認的會話存儲時,它可以完美地工作。 Redis守護程序以默認配置託管在Vagrant虛擬機上,並且該應用程序可以連接到它,儘管它不想將會話保存到它。connect-redis和快速會話結果在req.session undefined

這裏是我的代碼:

var express = require('express'); 
var glob = require('glob'); 

var favicon = require('serve-favicon'); 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 
var compress = require('compression'); 
var methodOverride = require('method-override'); 
var session = require('express-session'); 
var passport = require('passport'); 
var redis = require('redis'); 
var RedisStore = require('connect-redis')(session); 
var auth = require('./passport'); 
var flash = require('connect-flash'); 

module.exports = function(app, config) { 
    app.set('views', config.root + '/app/views'); 
    app.set('view engine', 'jade'); 

    // app.use(favicon(config.root + '/public/img/favicon.ico')); 
    app.use(logger('dev')); 
    app.use(bodyParser.json()); 
    app.use(bodyParser.urlencoded({ 
    extended: true 
    })); 
    app.use(cookieParser()); 
    app.use(session({ 
    store: new RedisStore({ 
     host: config.redis.host, 
     port: config.redis.port 
    }), 
    secret: config.secret, 
    saveUninitialized: true, 
    resave: false 
    })); 
    /*app.use(session({ 
    secret: config.secret, 
    saveUninitialized: true, 
    resave: true 
    }));*/ 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(flash()); 
    app.use(compress()); 
    app.use(express.static(config.root + '/public')); 
    app.use(methodOverride()); 

    var controllers = glob.sync(config.root + '/app/controllers/*.js'); 
    controllers.forEach(function (controller) { 
    require(controller)(app); 
    }); 

    app.use(function (req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
    }); 

    if(app.get('env') === 'development'){ 
    app.use(function (err, req, res, next) { 
     res.status(err.status || 500); 
     res.render('error', { 
     message: err.message, 
     error: err, 
     title: 'error' 
     }); 
    }); 
    } 

    app.use(function (err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
     message: err.message, 
     error: {}, 
     title: 'error' 
    }); 
    }); 

}; 

正如你所看到的,我得到了默認的註釋掉了,如果我刪除這些評論並註釋掉Redis的商店,它的作品,因爲它應該。任何線索爲什麼發生這種情況?我沒有收到一個錯誤。

回答

3

您可能有一些連接錯誤,但connect-redis不會將它們輸出到控制檯(請參閱connect-redis source code)。看到他們,你可以創建一個用於創建一個客戶機實例單獨的模塊,並把它傳遞給RedisStore構造:

// redisClient.js 
var redis = require('redis'); 

var redisClient = redis.createClient('localhost', 6379); // replace with your config 

redisClient.on('error', function(err) { 
    console.log('Redis error: ' + err); 
}); 

module.exports = redisClient; 

Redis的客戶端也發出可能在調試有用的其他事件 - 見node-redis docs

// your code 
var redisClient = require('./redisClient.js`); 

(...) 

app.use(session({ 
    store: new RedisStore({ 
     client: redisClient 
    }), 
    secret: config.secret, 
    saveUninitialized: true, 
    resave: false 
})); 
+0

我我曾嘗試創建一個單獨的客戶端實例,但使用與此處提供的完全相同的代碼,但無濟於事。任何其他線索?謝謝! – Svenskunganka

+0

您是否可以爲redisClient發出的其他事件(如'ready','connect'或'end')添加偵聽器以查看連接是否實際建立? – lukaszfiszer

+1

我現在開始工作了,得到了一個ECONNRESET錯誤。 Vagrant虛擬機已經配置了另一個Redis服務器......另一個不起作用的就是'app.use(flash())'這一行。當我嘗試訪問'req.flash('error');'哪個Passport發送時,它是空的。它與默認快速會話存儲一起工作,但由於某種原因,不適用於Redis。 – Svenskunganka