Перезапуск сервера Node.js прекращает сеансы - PullRequest
19 голосов
/ 13 марта 2011

У меня полнофункциональная система регистрации / аутентификации пользователей с использованием промежуточного программного обеспечения Express и Connect.

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

Единственная проблема заключается в том, что сеансы сбрасываются при каждом перезапуске сервера.

https://github.com/remy/nodemon - и nodemon перезапускает node.js каждый раз, когда обнаруживает изменение файла.

Как сохранить постоянные сеансы?

Ответы [ 5 ]

23 голосов
/ 13 марта 2011

Как будто ваш код говорит, что вы используете 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.

14 голосов
/ 11 ноября 2011

Я пытался запустить Redis с помощью express.js, Google отправил меня сюда.Экспресс-реализация изменилась:

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.

Надеюсь, это поможет, я столкнулся с обеими этими проблемами.

8 голосов
/ 03 октября 2013

Я согласен со всеми по поводу Redis, но я думаю, что разные технологии являются проблемой с точки зрения обслуживания программного обеспечения. Если вы используете mongodb, например, есть connect-mongo (https://npmjs.org/package/connect-mongo),, если вы используете mysql, то есть connect-mysql (https://npmjs.org/package/connect-mysql), connect-couchdb для couchdb (https://npmjs.org/package/connect-couchdb) и т. Д.) на.

5 голосов
/ 09 апреля 2011

также, если вы используете экспресс, вам нужно сообщить секрет, когда приложение сообщает об использовании промежуточного программного обеспечения redis.

так, следуйте приведенному выше рецепту Альфреда, но сделайте следующее ...

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

app.use( express.cookieParser() );
app.use( express.session( { secret: "keyboard cat", store: new RedisStore }));
1 голос
/ 13 марта 2011

Когда умирает узел, я представляю, какое хранилище памяти вы используете.

Сохранять сеансы на диск?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...