2016-09-21 4 views
0

Я пишу промежуточное программное обеспечение, чтобы проверять учетные данные пользователя для каждого вызова.Выполнение функции остановлено в середине

Поскольку он предназначен для работы: я получаю идентификатор от пользователя. Проверка, для кого был создан токен. Если данные верны, я сохраняю их для использования в будущем.

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 - это асинхронная функция (вы даете ей обратный вызов).

Так шаги:

  • Введите Middleware
  • Вызов Token.findOne
  • Вызов next (последняя строка кода)
  • Token.findOne «s обратный вызов (но ваше приложение уже следующие посреднические услуги)

Вы должны:

  • Move next(), где при входе console.log('next step'); (и удалить последнюю строку)
  • Добавить next(err) в блоке поймать для распространения ошибки, если что-то пойдет не так