Автоматическая регистрация пользователя с помощью 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));
});
Другие вопросы по тегам