2016-09-21 22 views
0

ミドルウェアを作成して各呼び出しでユーザーの資格情報をチェックします。関数の実行が途中で中止されました

これは動作するためのものです。ユーザーからIDトークンを取得します。誰が作成されたトークンであるかを調べる。データが正しい場合は、将来の使用のために保存します。コンソールで

middleware = function(req, res, next) { 
    var storage = {}; 
    storage.ip = req.ip; 
    storage.logged = false; 
    storage.username = 'Guest'; 


    if(req.headers.authorization) { 

    var base64Id = req.headers.authorization.split(' '); 


    try { 

     var decoded = jwt.verify(base64Id[1], app.get('salt')); 
     console.log('decoded',decoded); 

     Token.findOne({ jti: decoded.abc }, function(err, token) { 
     if (err) { 
      console.log(err); 
     } 

     if(token.browser !== req.headers['user-agent'] || req.ip !== token.ip) { 
      console.log('incydent: niezgodność ip lub przeglądarki'); 
     } else { 
      User.findOne({_id: token.iss}, function(err, user) { 
      if(err) { 
       console.log(err); 
      } 
      if(user.name === decoded.name) { 
       console.log('data are correct'); 
       storage.username = user.name; 
       storage.logged = true; 
      } else { 
       console.log('data are wrong'); 
      } 
      }); 

      console.log('next step'); 
     } 

     }); 

    } catch(err) { 
     if(err.name === 'TokenExpiredError') { 
     token.deactivate(); 
     } else { 
     console.log('ERROR!',JSON.stringify(err,null,4)) 
     } 
    } 

    } 
    req.storage = storage; 
    next(); 
}; 

は、私の最後の行は「データが正確である」とconsole.log('next step');を持つ行が決して実行されていないです。コンソールにもエラーはスローされません。

+2

が正しく常にコードを助けインデントエラーを伝播するcatchブロックでnext(err)を追加します。 – qxz

答えて

0

Token.findOneは非同期関数です(コールバックを指定します)。

だから手順は次のとおりです。

  • はミドルウェアを入力し
  • コールToken.findOne
  • コールnext(あなたのコードの最後の行)
  • Token.findOneのコールバックが呼び出された(しかし、あなたのアプリケーションがすでにあります次のミドルウェア)

あなたは:

  • あなたがconsole.log('next step');を記録し(この最後の行を削除します)移動next()
  • 何かがうまくいかない場合
関連する問題