Автоматическая регистрация пользователя с помощью KoaJS и PassportJS
Я пытаюсь автоматически войти в систему пользователя с PassportJS.
Это мой текущий код:
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
});
});
Но когда я запускаю его, я получаю сообщение об ошибке:
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)
2 ответа
Быстрый полу-сумасшедший момент, и я понимаю, чтобы перенаправить в koa
он не использует res
но this
Вы должны сделать следующее:
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('/');
});
Ваш код в порядке, это просто res
называется response
так что просто поменяйvar res = this.res;
в var res = this.response;
и это будет работать нормально. res
существует, но это ответ модуля http узла, а не Коа Response
объект, и, следовательно, не имеет каких-либо redirect
метод. redirect
связан с this
Вот почему вы можете использовать this.redirect
, но это действительно Response
метод. Посмотрите на http://koajs.com/ для более подробной информации.
Чтобы избежать необходимости назначать this
, или же response
Вы могли бы просто связать this
к вашей функции, я думаю, что это чище в большинстве случаев:
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));
});