Node.js服务器重启会丢弃会话

时间:2011-03-12 22:50:19

标签: session node.js connect express

我使用快速连接中间件,拥有功能齐全的用户注册/身份验证系统。

app.use(express.session({store: require('connect').session.MemoryStore( {reapInterval: 60000 * 10} ) }))

唯一的问题是每次执行服务器重启时会话都会丢失。

https://github.com/remy/nodemon - 每次检测到文件更改时,nodemon都会重新启动node.js.

我如何拥有持久会话?

5 个答案:

答案 0 :(得分:23)

就像你的代码告诉你正在使用MemoryStore一样。这是易失性的,并在重启时被清除。我建议你使用connect_redis来坚持你的会话。 Redis是一家非常快的商店。

  1. 下载redis
  2. 编译redis:make
  3. 启动服务器:./redis-server
  4. npm install connect-redis
  5. var connect = require('connect') , RedisStore = require('connect-redis');
    
    connect.createServer(
      connect.cookieParser(),
      // 5 minutes
      connect.session({ store: new RedisStore })
    );
    
  6. 这只是为了让您快速入门。如果你想从redis中获得最大的收益,你应该阅读文档并配置redis。

答案 1 :(得分:14)

我试图使用express.js让Redis走上正轨,谷歌把我送到了这里。明确的实施改变了:

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

另一个重要的事情是快速配置的顺序。

app.configure(function(){

    app.enable('strict routing'); // removes trailing slash
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jqtpl');
    app.register('.html', require('jqtpl').express);
    app.use(express.favicon());
    app.use(express.methodOverride());
    app.use(express.compiler({src: __dirname + '/public', enable: ['sass']}));
    app.use(express.static(__dirname + '/public'));
    app.use(app.router);
    app.use(express.bodyParser());
    app.use(express.cookieParser());
    app.use(express.session({secret: _.config.secret, store: new RedisStore}));

});

cookieParser&会话配置需要位于配置的末尾,cookieParser必须放在express.session之前。

希望有所帮助,我遇到了这两个问题。

答案 2 :(得分:8)

我同意所有关于redis的人,但我认为不同的技术在软件维护方面是个问题。如果你使用的是mongodb,那么有connect-mongo(https://npmjs.org/package/connect-mongo),如果你使用的是mysql,那就是connect-mysql(https://npmjs.org/package/connect-mysql),connect-couchdb for couchdb(https://npmjs.org/package/connect-couchdb)等等。

答案 3 :(得分:5)

另外,如果你使用快递,你需要在告诉应用程序使用redis中间件时提供一个秘密。

所以,按照上面的阿尔弗雷德的食谱,但做以下......

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

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

答案 4 :(得分:1)

当节点死亡时,我会想象你正在使用的内存存储器。

将会话保留到磁盘?