2017-04-15 51 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` 
      })