2017-04-15 2 views
0

私は、jsonwebtokenでnodejsにREST APIを作成しています。問題は、トークンをデコードしてreq.sessionを設定するミドルウェアのオブジェクトプロパティとしてデコードされたトークンの値として、しかし私はrouter.post()メソッドのreq.sessionにしかアクセスできませんが、ミドルウェア機能で設定されたそのセッションデータプロパティにアクセスすることはできません。以下はルートミドルウェアに設定されたセッション変数は、ノードj +同時実行の問題ではアプリケーション全体からアクセスできません

私のサンプルコードでは、私が月を考えてREQオ​​ブジェクトは、すべてのアプリケーション上でavaliableされていないので、私は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(...) 
     }} 

ですセッションにアクセスする必要がある場合はいつでも、AuthenticateLibとセッションデータのプロパティをファイルに要求することができますか。

私のセッションデータは、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; 

技術のような何かをした同時実行の問題を解決するために

+0

「AuthenticateLib.sessiondata」は、私が見ることのできるすべてのリクエストで共有されます。つまり、サイトで複数の同時ユーザをサポートすることはできません。 – robertklep

+0

AuthenticateLib.sessiondataの寿命は、そのユーザーのその要求に対してのみです。複数の同時ユーザーがログインしている場合は、ユーザーごとにAuthenticateLib.sessiondataの複数のコピーが存在します。私が間違っている場合は私に連絡してください。 – Vibhas

+0

あなたは間違っています:) AuthenticateLib .sessiondata'はリクエストごとに同じプロパティなので、どのリクエストが行われたかにかかわらず、 'verifyToken'を呼び出すリクエストごとに上書きされます。 – robertklep

答えて

0

私は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` 
      }) 
関連する問題