Передайте req.user.username в качестве параметра для successRedirect в Passport.js

#node.js #express #passport.js

Вопрос:

Когда пользователь успешно входит в систему, я хочу перенаправить его на маршрут, который использует его имя пользователя в качестве параметра:

 router.post("/login", checkNotAuthenticated, passport.authenticate("local", {  successRedirect: "/dashboard/"   req.user.username,  failureRedirect: "/login",  failureFlash: true,  }) );  
 router.get("/dashboard/:username", checkAuthenticated, (req, res) =gt; {  res.render("dashboard", { user: req.user }); });  

Когда я пытаюсь это сделать, я получаю следующую ошибку:

 successRedirect: "/dashboard/"   req.user.username,   ^ ReferenceError: req is not defined  

(Я понимаю , почему req is not defined , но я показываю это, чтобы проиллюстрировать, что я хочу сделать.)

Я проверил, изменив маршрут на следующий:

 router.post("/login", (req, res) =gt; {  console.log(req.body.username); // a test; prints what is expected  passport.authenticate("local", {  successRedirect: "/dashboard/"   req.body.username,  failureRedirect: "/login",  failureFlash: true,  }); });  

Когда я войду в систему с данными, console.log(...) все работает как ожидалось и печатает имя пользователя. Однако successRedirect это не работает, так как он просто продолжает загружаться. В консоли также нет формы вывода.

Затем я также попытался req.user.username (на самом последнем маршруте), но он просто печатает:

 TypeError: Cannot read property 'username' of undefined  

Чтобы, наконец , добавить, когда я console.log(req.body) , я получу:

 [Object: null prototype] { username: 'user1', password: 'user1' }  

Есть ли что-то, чего я не понимаю?

Ответ №1:

Я цитирую документацию здесь:

 app.post('/login',  passport.authenticate('local'),  function(req, res) {  // If this function gets called, authentication was successful.  // `req.user` contains the authenticated user.  res.redirect('/users/'   req.user.username);  });  

passport.authenticate('local') действует как промежуточное программное обеспечение и вызовет следующую функцию, которая может получить доступ к объекту Req.

Комментарии:

1. Да, я буквально только что наткнулся на это. Спасибо тебе, аня

Ответ №2:

Я нашел решение (довольно быстро после написания этого поста). Я думаю, что это все же стоит отметить на случай, если другие окажутся в таком положении.

 router.post(  "/login",  passport.authenticate("local", {  failureRedirect: "/login",  failureFlash: true,  }),(req, res) {  res.redirect("/dashboard/"   req.user.username);  } );  

Я согласен successRedirect , так как успешный вход в систему в любом случае запустит функцию маршрута; все , что вам нужно сделать, это зарегистрировать неудачные попытки входа в систему (т. Е. failureRedirect или обработать 401 код статуса), так как вы можете перенаправить пользователя с req.user помощью существующего.