2016-06-03 13 views
1

Der Versuch, eine lokale Pass Strategie in Koa 2 zu implementieren, aber ich bin fehlt etwas Wesentliches ...Koa 2 + Passport + async

Als meine Route trifft passport.authenticate(), ich bin in der Lage meine abrufen Benutzer, aber ich komme nie von diesem warten(), so dass mein Code nicht weiter geht.

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; 
    } 
})); 

Routen

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; 
    } 
}); 

So Hits meinen Code ('USER GEFUNDEN - FERTIG') ... aber ich nie erreichen 'ICH MACHE NIE ES DIESER STELLE' in die Route. Habe versucht, einige Dinge zu wechseln, also bin ich mir sicher, dass es etwas wirklich albernes sein könnte, was ich nicht richtig mache.

+0

Ich denke, ein Teil meines Problems kann sein, dass pass.authenticate() kein Versprechen zurückgibt. Versuchen Sie es in co() zu verpacken. –

+0

Verwenden Sie https://github.com/rkusa/koa-passport? – laggingreflex

+0

Yup, mit dem @ next-Tag auch. Das Problem ist, dass der Reisepass selbst keine Versprechen zurück gibt, also müssen Sie selbst eine zurückgeben –

Antwort

0

Also mein Problem war, dass pass.authentincate() einen guten ol Callback zurückgibt und ich versuchte, es als ein Versprechen zu verwenden.

ich die lokale Strategie in einer Co() -Funktion eingewickelt und es funktioniert:

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; 
    } 
    }); 
})); 

Ich würde gerne wissen, ob es eine andere Art und Weise ist dies in voller async/erwarten Mode zu erreichen - ich hatte gehofft, dafür nicht co() benutzen zu müssen.

+0

Sie können versuchen, Typoskript und genießen Sie die Macht der Async erwarten. – Zen

1

Sie könnten diese ausgecheckt in letzter Zeit, aber irgendwie glaube ich, dies ist ein Blick wert: NPM: koa-passport

Außerdem Rückkehr ein Versprechen manuell ziemlich einfach ist (eine Funktion bis Einwickeln von new Promise oder return async() => ..; verwenden)