Передача параметров в POST в Express с паспортом

1

Я сделал небольшое приложение для входа, используя Express и Passport. Но, похоже, я не могу направить пользователя в определенный пользовательский файл. Что должно произойти, пользователь заполняет HTML-форму, и он должен перенаправляться на свою собственную страницу профиля (ради простоты, скажем, что страница отличается от других пользовательских страниц только с точки зрения названия). У меня это в моих пользовательских маршрутах. (т.е. route/users.js)

router.get('/userprofile', authenticationMiddleware(), function (req, 
res, next) {
    res.render('userprofile');
});


router.post('/login', passport.authenticate('local-login', {
        successRedirect: '/users/userprofile',
        failureRedirect: '/users/login',
        failureFlash: true
}));

В моем файле config.js у меня есть это.

passport.use('local-login', new LocalStrategy({
    usernameField: 'username',
    passwordField: 'password',
    passReqToCallback: true
}, function (req, username, password, done) {
    db.pool.getConnection(function (err, connection) {
       if(err) throw err;
       var query = connection.query('SELECT * from users WHERE username = ?', username, function (err, rows) {
          if(err) return done(err);
          if(!rows.length) {
              return done(null, false, req.flash('loginMessage', 'No User Found'));
          }
          //Comparing passwords using bcrypt
           bcrypt.compare(password, rows[0].password, function(error, res){
               if(res){
                   return done(null, rows[0]);
               } else {
                   return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.'));
               }
           });
       });
    });
}));

Что мне нужно сделать, так это получить имя пользователя из формы и передать его в атрибут successRedirect в файле passport.authenticate, а затем я могу изменить метод get, добавив параметр маршрута, например "/users/: username" и сделать "username", Посмотреть.

Как я могу это сделать?

РЕДАКТИРОВАТЬ:

Я сделал что-то вроде этого.

router.get('/userprofile/:username', authenticationMiddleware(), function (req, res, next) {
    res.render('userprofile', {
        username: req.params.username,
        title: 'Welcome, '+ req.params.username
    });
});


router.post('/login', function (req, res, next) { //Testing callback.
    console.log("Username is: " + req.body.username);
    passport.authenticate('local-login', {
        successRedirect: '/users/userprofile/' + req.body.username, 
        failureRedirect: '/users/login',
        failureFlash: true
    })(req, res);    
    next();
});

Это работает на некоторые попытки. Тем не менее, он иногда возвращает эту ошибку.

POST /users/login 404 43.741 ms - 5226 /home/dasun/WebstormProjects/schoolentry/node_modules/passport/lib/middleware/authenticate.js:249
      if (err) { return next(err)}; 

Как я могу избавиться от этой ошибки?

Благодарю.

  • 0
    Не могли бы вы использовать req.user в вашем / userprofile маршруте вместо его прохождения?
  • 0
    @GibryonBhojraj спасибо за ответ. Я добавил некоторые правки в раздел РЕДАКТИРОВАТЬ моего вопроса. Я мог бы добавить имя пользователя к запросу, но он возвращает ту ошибку, которую я указал в разделе РЕДАКТИРОВАТЬ ... Это происходит только иногда ... Иногда это работает, но иногда я получаю эту ошибку.
Теги:
express
login
passport.js

1 ответ

1
Лучший ответ

Нашел ответ. Я пропустил next в методе POST в /login.

т.е. я должен написать

router.post('/login', function (req, res, next) { //Testing callback.
console.log("Username is: " + req.body.username);
passport.authenticate('local-login', {
    successRedirect: '/users/userprofile/' + req.body.username, 
    failureRedirect: '/users/login',
    failureFlash: true
})(req, res, next);
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню