我在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属性相关的并发问题。
任何帮助都将不胜感激。
答案 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`
})