簡體   English   中英

路由中間件中設置的會話變量無法在nodejs +並發問題的整個應用程序中訪問

[英]Session variable set in route middleware is not accessible throughout application in nodejs + concurrency issues

我正在使用jsonwebtoken在nodejs中創建REST api,以進行身份​​驗證。問題是我創建了自己的路由中間件,該中間件對令牌進行解碼並將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屬性相關的並發問題。

任何幫助,將不勝感激。

為了解決並發問題,我做了類似的事情

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;

從技術上講,我並沒有解決會話問題,只是修改了我的設計模式,以便在每個請求上創建的每個新obj上都設置sessiondata,這對於每個請求都是唯一的,從而解決了我的並發和整個會話問題。

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`
          })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM