2017-04-15 67 views
0

我創造的NodeJS中的REST API與jsonwebtoken爲authentication.Problem是我創造我自己的路線中間件,解碼令牌和套req.session以及作爲解碼標記值的中間件對象屬性,但我只能訪問router.post()方法中的req.session,但無法訪問在中間件功能中設置的sessiondata屬性。變量不是在整個應用程序的NodeJS訪問+併發問題

下面是我的示例代碼

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對象未遍佈應用avaliable,所以我想可能是我可以要求AuthenticateLib的,並在我需要訪問我的會話的任何地方訪問我的文件中的sessiondata屬性。

我的目標是,我應該能夠訪問不僅router.post但在應用程序的任何其他文件我的會話數據。

我試着添加AuthenticateLib.sessiondata = req.session;只是在router.post行之後,一切正常,但它是唯一的方法。爲什麼不設置中間件sessiondata屬性不起作用。 另外我該如何解決與sessiondata屬性相關的併發問題。

任何幫助,將不勝感激。

+0

即使它可以工作,「AuthenticateLib.sessiondata」將在我看到的所有請求之間共享,這意味着您的站點永遠不會支持多個併發用戶。如果多個併發用戶已登錄會有AuthenticateLib.sessiondata的多個副本按user.correct我,如果我錯了 – robertklep

+0

AuthenticateLib.sessiondata生活會只爲user.So的這一請求.sessiondata'是每個請求的相同屬性,所以它將被每個調用'verifyToken'的請求覆蓋,而不管代表哪個用戶發出了請求。 – Vibhas

+0

你錯了:)'AuthenticateLib – robertklep

回答

0

爲了解決併發的問題我不喜歡的東西

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; 

技術上我沒有解決會議的問題,只是修改了我的設計模式,使sessiondata每次都會設置每個請求上創建的新obj對每個請求都是唯一的,這反過來又解決了我的併發問題和整體會話問題。

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