Переменная сеанса, установленная в промежуточном программном обеспечении маршрута, недоступна для всего приложения в nodejs + проблемы с параллелизмом

Я создаю REST api в nodejs с jsonwebtoken для аутентификации. Проблема в том, что я создал свое собственное промежуточное программное обеспечение маршрута, которое декодирует токен и устанавливает req.session, а также свойство объекта промежуточного программного обеспечения для декодированного значения токена, но я могу получить доступ только к req.session в маршрутизаторе .post (), но не может получить доступ к этому свойству sessiondata, установленному в функции промежуточного программного обеспечения.

Ниже мой пример кода

user.js

 var router=require('express').Router();
 var AuthenticateLib=require('app/libraries/authentication');

 router.post('/updateprofile',AuthenticateLib.verifyToken,function(req,res){
  console.log(req.session); // is accessible over here
  console.log(AuthenticateLib.sessiondata) // prints null
});

authentication.js

  module.exports={
  sessiondata:null,
  verifyToken:function(req,res,next){
           var token = req.headers.authorization;
            return jwt.verifyAsync(token,config.getParam('security.jwtSecret'))
                    .then(decoded => {
                            req.session=decoded;
                            this.sessiondata=decoded;
                            next(); 
                    })
                    .catch(...)
       }}

Я создал свойство sessiondata, потому что объект req недоступен для всего приложения, поэтому я подумал, что может потребоваться AuthenticateLib и получить доступ к свойству sessiondata в моих файлах везде, где мне нужно получить доступ к моему сеансу.

Моя цель состоит в том, чтобы иметь доступ к данным моей сессии не только в router.post, но и в любом другом файле приложения.

Я пробовал добавить AuthenticateLib.sessiondata = req.session; сразу после строки router.post все работает нормально, но это единственный способ. Почему свойство sessiondata, установленное в промежуточном программном обеспечении, не работает. Также как я могу решить проблемы параллелизма, связанные со свойством sessiondata.

Любая помощь будет оценена по достоинству.


person Vibhas    schedule 15.04.2017    source источник
comment
Даже если это сработает, AuthenticateLib.sessiondata используется для всех запросов из того, что я вижу, а это означает, что ваш сайт никогда не может поддерживать более одного одновременного пользователя.   -  person robertklep    schedule 15.04.2017
comment
AuthenticateLib.sessiondata жизнь будет только для этого запроса этого пользователя. Поэтому, если несколько одновременных пользователей вошли в систему, будет несколько копий AuthenticateLib.sessiondata для каждого пользователя. Исправьте меня, если я ошибаюсь   -  person Vibhas    schedule 15.04.2017
comment
Вы ошибаетесь :) AuthenticateLib.sessiondata - это одно и то же свойство для каждого запроса, поэтому оно будет перезаписано каждым запросом, вызывающим verifyToken, независимо от того, от имени какого пользователя был сделан этот запрос.   -  person robertklep    schedule 15.04.2017
comment
как я могу это исправить?   -  person Vibhas    schedule 15.04.2017
comment
Боюсь, нелегко. Как правило, req (или данные из req, которые требуются) передаются по всему приложению.   -  person robertklep    schedule 15.04.2017
comment
как насчет stackoverflow.com/questions/28833808/   -  person Vibhas    schedule 15.04.2017
comment
Вам все равно придется передавать этот вновь созданный экземпляр через все ваше приложение, что ничем не отличается от передачи req.   -  person robertklep    schedule 15.04.2017
comment
Если нет способа решить эту проблему, что вы порекомендуете дальше. Следует ли мне придерживаться узла. Не стесняйтесь дать совет.   -  person Vibhas    schedule 15.04.2017
comment
Вы должны скорректировать заявленную цель (чтобы иметь доступ к данным сеанса повсюду, не передавая по крайней мере что-то). Приложения Node.js требуют иной структуры, чем, скажем, приложения PHP. Есть множество людей, которым нравится использовать Node (я один из таких людей), но решать вам, хотите ли вы соответствовать тому, как он работает.   -  person robertklep    schedule 15.04.2017
comment
Я готов изменить свою цель, просто покажи мне дорогу.   -  person Vibhas    schedule 15.04.2017
comment
передать req или необходимые данные в качестве аргумента. Везде вам это нужно. Вот и все.   -  person robertklep    schedule 15.04.2017
comment
Я опубликовал свое решение, дайте мне знать, может ли оно вызвать проблемы с параллелизмом   -  person Vibhas    schedule 20.04.2017
comment
Нет, я думаю, теперь ты в порядке. По сути, это то же самое, что я предлагал, но вместо того, чтобы передавать req, вы должны передать Obj (или инкапсулировать весь код, требующий доступа к mysessiondata, с помощью этой функции).   -  person robertklep    schedule 20.04.2017
comment
Спасибо за совет и за выявление проблемы параллелизма в коде :-)   -  person Vibhas    schedule 20.04.2017


Ответы (1)


Чтобы решить проблему параллелизма, я сделал что-то вроде

authentication.js

           function fname()
           {
             var x,y,mysessiondata; // all private vars
             return {
                     setsessiondata:function(data){mysessiondata=data;}, // public methods and vars
                     foo:function(){},.....   
             }
           }

           module.exports=fname;

Технически я не решил проблему сеанса, просто изменил свой шаблон проектирования, чтобы данные сеанса устанавливались для каждого нового объекта, созданного для каждого запроса, который был бы уникальным для каждого запроса, что, в свою очередь, решает мою проблему параллелизма и общую проблему сеанса.

var AuthenticateLibObj=require('authentication');

 router.post('/updateprofile',AuthenticateLib.verifyToken,function(req,res){ 
          var Obj=new AuthenticateLibObj();
          Obj.setsessiondata(req.session);
          Obj.foo(); // so I dont need to pass session to foo again it can get it from its private datamember `mysessiondata`
          })
person Vibhas    schedule 20.04.2017