connect-redis和express-session导致req.session未定义

时间:2014-12-29 17:13:42

标签: node.js session express node-redis

我正在尝试使用快速会话将会话存储在Redis中,但它似乎并不想保存。当我恢复到默认会话存储时,它可以完美地工作。 Redis守护程序托管在具有默认配置的Vagrant VM上,应用程序可以连接到它,但它不想将会话保存到它。

这是我的代码:

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商店,它就可以正常工作了。任何线索为什么会发生这种情况?我没有收到任何错误。

1 个答案:

答案 0 :(得分:4)

您可能有一些连接错误,但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 
}));