20

我拥有使用 express 和 connect 中间件的功能齐全的用户注册/身份验证系统。

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

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

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

我怎样才能有持久的会话?

4

5 回答 5

24

就像您的代码告诉您正在使用 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 })
    );
    

这只是为了让您快速入门。如果你想充分利用 redis,你应该阅读文档并配置 redis。

于 2011-03-12T23:27:55.117 回答
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.

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

于 2011-11-10T23:13:52.497 回答
8

我同意每个人关于 redis 的看法,但我认为不同的技术在软件维护方面是一个问题。例如,如果您使用的是 mongodb,则有 connect-mongo ( https://npmjs.org/package/connect-mongo ),如果您使用的是 mysql,则有 connect-mysql ( https://npmjs.org/package/connect -mysql),用于 couchdb 的 connect-couchdb (https://npmjs.org/package/connect-couchdb)等等。

于 2013-10-03T07:20:48.483 回答
6

另外,如果您使用的是 express,则在告诉应用程序使用 redis 中间件时需要提供一个秘密。

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

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

app.use( express.cookieParser() );
app.use( express.session( { secret: "keyboard cat", store: new RedisStore }));
于 2011-04-08T21:06:09.767 回答
1

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

将会话持久化到磁盘?

于 2011-03-12T22:53:52.677 回答