Коа 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 () => ..;
)