【问题标题】:Node.js server restart drops the sessionsNode.js 服务器重启会丢弃会话
【发布时间】:2011-07-14 06:03:00
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我想知道如何使用 JWT 而不是使用数据库来进行持久会话...??

标签: session node.js connect express


【解决方案1】:

我试图使用 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】:

    我同意大家对 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】:

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

      【讨论】:

      • 只是好奇你为什么在 RedisStore 中使用 ProperCase,这是否有 NodeJS 约定/原因?
      • @ClarenceLiu 类名通常选择为 ProperCase(或 CamelCase 或您想要的名称)。
      • 啊酷,对我来说 camelCase 以小写开头,但我确实喜欢这种约定。
      【解决方案4】:

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

      所以,按照上面 Alfred 的食谱,但请执行以下操作...

      var express = require( 'express' );
      var RedisStore = require('connect-redis');
      
      app.use( express.cookieParser() );
      app.use( express.session( { secret: "keyboard cat", store: new RedisStore }));
      

      【讨论】:

      【解决方案5】:

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

      将会话保存到磁盘?

      【讨论】:

      • 当redis在一个额外的进程中处理会话时,会话会在节点崩溃和节点重启后幸存下来,如果redis宕机,会话也会相应地关闭
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多