问题
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