1

Koa 2 でローカル Passport 戦略を実装しようとしていますが、重要なものがありません...

私のルートがpassport.authenticate()に到達すると、ユーザーを取得できますが、そのawait()から戻ることはないため、コードはそれ以上進みません。

認証:

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')... しかし、ルートで 'I NEVER MAKE IT TO THIS POINT' に到達することはありません。いくつかのことを切り替えてみたので、私が正しくやっていない本当にばかげたものになる可能性があると確信しています。

4

2 に答える 2

2

最近これをチェックしたかもしれませんが、とにかく、これは一見の価値があると思います: NPM: koa-passport

さらに、Promise を手動で返すのは非常に簡単です (new Promiseまたはを使用して関数をラップしますreturn async () => ..;) 。

于 2016-09-20T03:01:06.783 に答える
0

したがって、私の問題は、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() を使用する必要がないことを望んでいました。

于 2016-06-03T19:44:01.573 に答える