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')......但我从来没有在路线中达到'我从来没有做到这一点'。已经尝试过切换几件事,所以我确信这可能是我做得不对的事情。

4

2 回答 2

2

您最近可能已经检查过了,但无论如何,我相信这值得一看:NPM:koa-passport

此外,手动返回 Promise 非常简单(使用new Promiseor包装函数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 回答