Automatically logging in a user with KoaJS and PassportJS

丶灬走出姿态 提交于 2019-12-25 03:34:52

问题


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


来源:https://stackoverflow.com/questions/30448535/automatically-logging-in-a-user-with-koajs-and-passportjs

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!