koa-router 和 passport 链接结果到回调

koa-router and passport chaining results into callback

好的,所以我最近从 express 迁移到 koa,我这里的主要问题是关于 koa-router 和护照身份验证。

回到 express 我可以做类似的事情

router.route('/someroute')
      .post(passport.authenticate('local' , {session:false}) , 
                                  function(req,res,next){req.authresult});

基本上发生的事情是,一旦通过护照策略进行身份验证,策略中返回的任何对象都将汇集到 REQ 对象中,我可以在主控制器函数中访问它。方便吧?

好的,这就是 koa 的做法,好吧:

router.post('/someroute' , function(ctx,next){
return passport.authenticate('jwt' ,(err,user,info,status) =>{ 
           ....
 })(ctx);

既然解释了这种情况,我的问题是:

1。 是否可以像 express 那样做路由,比如

router.post('/someroute',passport.authenticate(..),function(ctx){ ctx.user 
});

2。 如果我不传递像

这样的 ctx 对象,为什么我会得到一个未找到的结果
passport.authenticate(...)(ctx);

这种将对象放入定义的方法中的实现称为什么。我在哪里可以了解它?

像往常一样,我做了一些研究,准备自己回答这个问题。

1.Yes ,可以在不声明护照身份验证的自定义回调的情况下像 express 一样进行路由。

router.post('../someroute',passport.authenticate('strategy',options),function(ctx){
//access passport return object through ctx.state.user
}

但是这样做的缺点是,如果策略 return 出现类似 done(err) 的错误,错误处理将不会由您的路由回调完成,而是会自动通过内部服务器进行响应koa的错误。如果您希望 return 与身份验证相关的错误,则必须通过具有添加属性的相同 ctx.state.user 对象来完成。

2.passport.authenticate() returns 一个函数,需要一个请求,res/ctx 对象因此不提供将导致错误(内部承诺拒绝,未提供 ctx)。在上面的声明中,router.post 处理这个 automatically.However ,在另一个函数中声明它需要你传递 ctx.