在nodejs +并发问题的整个应用程序中无法访问路由中间件中设置的会话变量

时间:2017-04-15 06:54:24

标签: javascript node.js session express json-web-token

我在nodejs中使用jsonwebtoken创建REST api用于身份验证。问题是我创建了自己的路由中间件,它解码令牌并将req.session以及中间件对象属性设置为已解码的令牌值,但我只能访问req。 router.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属性相关的并发问题。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分: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;

从技术上讲,我没有解决刚修改我的设计模式的会话问题,因此会在每个请求上创建的每个新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`
          })