Node.js服务器重新启动会删除会话

fnvucqvd  于 2023-02-03  发布在  Node.js
关注(0)|答案(5)|浏览(215)

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

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

唯一的问题是每次执行服务器重新启动时会话都会丢失。
https://github.com/remy/nodemon-并且nodemon在每次检测到文件更改时重新启动node.js。
我怎样才能拥有持续会话?

iqxoj9l9

iqxoj9l91#

就像你的代码告诉你正在使用MemoryStore。这是易失性的,在重新启动时会被清除。我建议你使用connect_redis来持久化你的会话。Redis是一个非常快的存储。
1.下载redis
1.编译redis:make
1.启动服务器:./redis-server

  1. npm install connect-redis
var connect = require('connect') , RedisStore = require('connect-redis');

connect.createServer(
  connect.cookieParser(),
  // 5 minutes
  connect.session({ store: new RedisStore })
);

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

unhi4e5o

unhi4e5o2#

我试图使用express.js让Redis走上正轨,Google把我送到这里。express的实现方式发生了变化:

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之前。
希望这能有所帮助,我在这两个问题上都跑过。

oug3syen

oug3syen3#

我同意大家对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)等等。

nkkqxpd9

nkkqxpd94#

此外,如果你使用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 }));
bwitn5fc

bwitn5fc5#

当节点死亡时,我可以想象你正在使用的内存存储也会死亡。
将会话持久化到磁盘?

相关问题