繁体   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