Коа 2 + Паспорт + Асинхронный

Пытаюсь реализовать локальную стратегию Passport в Koa 2, но мне не хватает чего-то жизненно важного...

Когда мой маршрут достигает passport.authenticate(), я могу получить своего пользователя, но я никогда не возвращаюсь из этого await(), поэтому мой код больше не прогрессирует.

Auth:

passport.use( new LocalStrategy(async(username, password, done) => {
  console.log('AUTHENTICATING!');
  try {
     let user = await User.findOne({username:username});
    if(user) {
      console.log('USER FOUND - DONE');
      done(null, user);
    } else {
      console.log('USER NOT FOUND - DONE');
      done(null, false);
  }
  } catch (err) {
    throw err;
  }
}));

маршруты

router.post('/login', bodyParser(), async(ctx, next) => {
  try {
    await passport.authenticate('local')(ctx,next);
    console.log('I NEVER MAKE IT TO THIS POINT');
  } catch (err) {
    throw err;
  }
});

Таким образом, мой код нажимает ("USER FOUND - DONE")… но я никогда не достигаю "Я НИКОГДА НЕ СДЕЛАЮ ЭТО ЭТОМУ ТОЧКУ" на маршруте. Попробовал переключить несколько вещей, так что я уверен, что это может быть что-то действительно глупое, я не делаю правильно

2 ответа

Решение

Поэтому моя проблема заключалась в том, что passport.authentincate() возвращает хороший обратный вызов, и я пытался использовать его как обещание.

Я обернул локальную стратегию в функцию co(), и она работает:

passport.use( new LocalStrategy('local', function(username, password, done) {
  return co(function*(){
    try {
      let user = yield Promise.resolve(User.findOne({username:username}));
      if(user) {
        console.log('USER FOUND - DONE');
        return done(null, user);
      } else {
        console.log('USER NOT FOUND - DONE');
        return done(null, false);
      }
    } catch (err) {
      throw err;
    }
  });
}));

Я хотел бы знать, есть ли какой-либо другой способ сделать это полностью асинхронным / ожидающим способом - я надеялся не использовать co() для этого.

Вы могли бы проверить это в последнее время, но в любом случае, я считаю, что это стоит посмотреть: NPM: koa-passport

Кроме того, вернуть Обещание вручную довольно просто (завершение функции с помощью new Promise или же return async () => ..;)

Другие вопросы по тегам