Automatically logging in a user with KoaJS and Pas

2019-09-02 09:27发布

问题:

I'm trying to automatically log in a user with PassportJS.

This is my current code:

myRouter.get('/signin', function* (next) {

    user = {...};

    var res = this.res; // needed for the function below
    this.req.login(user, function(err) {
        if (err)
            console.log('error logging in user - '+err);
        return res.redirect('/'); // <--- line 439
    });
});

But when I run it, I get the error:

  error logging in user - TypeError: undefined is not a function
  TypeError: undefined is not a function
      at /srv/www/domain.com/app.js:439:32
      at /srv/www/domain.com/node_modules/koa-passport/node_modules/passport/lib/http/request.js:49:48
      at pass (/srv/www/domain.com/node_modules/koa-passport/node_modules/passport/lib/authenticator.js:293:14)
      at Authenticator.serializeUser (/srv/www/domain.com/node_modules/koa-passport/node_modules/passport/lib/authenticator.js:295:5)
      at Object.req.login.req.logIn (/srv/www/domain.com/node_modules/koa-passport/node_modules/passport/lib/http/request.js:48:29)
      at Object.<anonymous> (/srv/www/domain.com/app.js:434:26)
      at GeneratorFunctionPrototype.next (native)
      at Object.dispatch (/srv/www/domain.com/node_modules/koa-router/lib/router.js:317:14)
      at GeneratorFunctionPrototype.next (native)
      at Object.<anonymous> (/srv/www/domain.com/node_modules/koa-common/node_modules/koa-mount/index.js:56:23)

回答1:

A quick semi-derp moment and I realize to redirect in koa it does not use res but this, you must do the following:

var res = this; // needed for the next function
this.req.login(user, function(err) {
    if (err)
        console.log('error logging in user - '+err);
    return res.redirect('/');
});


回答2:

Your code is fine, it is just that res is called response, so just change var res = this.res; in var res = this.response; and it will work fine. res does exist, but it is the Node http module response, not the Koa Response object, and therefore does not have any redirect method. The redirect is aliased to this, which is why you can use this.redirect, but it really is a Response method. Take a look at http://koajs.com/#context for more details.

To avoid having to assign this, or response, you could just bind this to your function, I think it is cleaner in most cases:

myRouter.get('/signin', function* (next) {

    user = {...};

    this.req.login(user, function(err) {
        if (err)
            console.log('error logging in user - '+err);
        return this.redirect('/'); // <--- line 439
    }.bind(this));
});