我正在使用Express和Connect中间件开发完全功能的用户注册/认证系统。
app.use(express.session({store: require('connect').session.MemoryStore( {reapInterval: 60000 * 10} ) }))
唯一的问题是每次服务器重启时会丢失会话。
nodemon 检测到文件更改后会重新启动 Node.js。
我该如何保持持久会话?
我正在使用Express和Connect中间件开发完全功能的用户注册/认证系统。
app.use(express.session({store: require('connect').session.MemoryStore( {reapInterval: 60000 * 10} ) }))
唯一的问题是每次服务器重启时会丢失会话。
nodemon 检测到文件更改后会重新启动 Node.js。
我该如何保持持久会话?
您的代码显示您正在使用MemoryStore,该存储是易失性的,在重新启动后会被清除。我建议您使用connect_redis 来保存您的会话。Redis是一种极快的存储方式。
make
./redis-server
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。
我正在尝试使用express.js来使用Redis,谷歌将我带到了这里。express的实现发生了变化:
var express = require('express'),
RedisStore = require('connect-redis')(express);
另一个重要的事情是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
和 session 的配置需要放在配置的最后,cookieParser
必须紧接在 express.session
之前。
希望这可以帮到你,我也曾遇到这两个问题。
我同意大家对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),等等。
另外,如果您正在使用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 }));
当节点死亡时,我想你正在使用的内存存储也会死亡。
将会话持久化到磁盘上吗?