2016-09-21 176 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

正確縮進代碼總是幫助 – qxz

回答

0

Token.findOne是一個異步函數(你給它一個回調函數)。

因此,步驟是:

  • 進入中間件
  • 呼叫Token.findOne
  • 呼叫next(代碼的最後一行)
  • Token.findOne的回調被調用(但你的應用程序已經在下一個中間件)

您應該:

  • 移動next()在那裏你登錄console.log('next step');(並刪除最後一行)
  • 在catch塊傳播錯誤添加next(err)如果有什麼不順心