Экспресс-сессия - одновременные модификации на сессии - PullRequest
0 голосов
/ 08 декабря 2018

Я реализую сервисы на основе сеансов с использованием expressjs и express-session с хранилищем redis-connect в nodejs, и у меня возникла проблема с одновременными изменениями в хранилище сеансов.Найдите следующий пример проблемы:

  • Два опубликованных маршрута: / api / op1 и / api / op2
  • / api / op1: Увеличьте значение request.session.op1Callsи выполняет вызовы к внешним службам (3 секунды)
  • / api / op2: увеличить значение request.session.op2Calls и просто ничего не делать (должно быть выполнено 0,1 мс)

Проблема в следующем: если я выполняю op2 несколько раз во время выполнения op1, значение request.session.op2Calls просто теряется.Как мне реализовать хранилище сеансов, чтобы никогда не терять значения?

Спасибо!

1 Ответ

0 голосов
/ 08 декабря 2018

Экспресс-сессия (request.session) читается из хранилища (в вашем случае redis store) в момент выполнения запроса.

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

Что можно сделать, чтобы смягчить это, это перезагрузить сеанс доsave:

app.get( "/op2", function( req, res, next ) {
   someReallyLongAsyncTask( function() {
       req.session.reload(function(err) {    
           if ( !req.session.op2Call ) { req.session.op2Call = 0; }
           req.session.op2Call++;
           req.session.save( function() { 
               res.json( { success: true } )
           } );
       } );
   } );    
} );

Таким образом, вы убедитесь, что сессия перечитывается перед сохранением.

...