2016-06-03 2 views
1

Попытка реализовать стратегию местного паспорта в Коа 2, но я что-то жизненно не хватает ...Коа 2 + паспорт + асинхронной

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

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 НАЙДЕНО - DONE') ... но я никогда не достичь 'Я никогда не делаю это к этому пункту' в маршрут. Попробовали переключить несколько вещей, поэтому я уверен, что это может быть что-то действительно глупо, я не прав.

+0

Я думаю, что часть моей проблемы может заключаться в том, что passport.authenticate() фактически не возвращает обещание. Можете попробовать обернуть его в co() –

+0

Вы используете https://github.com/rkusa/koa-passport? – laggingreflex

+0

Yup, используя также тег @next. Проблема в том, что сам паспорт еще не возвращает обещаний, поэтому вам нужно вернуть его самостоятельно. –

ответ

0

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

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

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().

+0

Вы можете попробовать машинописный текст и наслаждаться силой ожидания async. – Zen

1

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

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

Смежные вопросы