2016-09-21 126 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)如果有什么不顺心