#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
помощью существующего.