将 req.user.username 作为参数传递给 Passport.js 中的 successRedirect
Pass req.user.username as a parameter to successRedirect in 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) => {
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) => {
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' }
有什么我不明白的地方吗?
我在这里引用文档:
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对象的函数。
我找到了解决方案(在写这篇文章后很快 post)。我认为仍然值得注意,以防其他人处于这种情况。
router.post(
"/login",
passport.authenticate("local", {
failureRedirect: "/login",
failureFlash: true,
}),(req, res) {
res.redirect("/dashboard/" + req.user.username);
}
);
我省略了successRedirect
,因为成功登录无论如何都会运行路由功能;您所要做的就是考虑失败的登录尝试(即 failureRedirect
,或处理 401
状态代码),因为您可以使用现在存在的 req.user
重定向用户。
当用户成功登录后,我想将他们重定向到以用户名作为参数的路由:
router.post("/login", checkNotAuthenticated, passport.authenticate("local", {
successRedirect: "/dashboard/" + req.user.username,
failureRedirect: "/login",
failureFlash: true,
})
);
router.get("/dashboard/:username", checkAuthenticated, (req, res) => {
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) => {
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' }
有什么我不明白的地方吗?
我在这里引用文档:
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对象的函数。
我找到了解决方案(在写这篇文章后很快 post)。我认为仍然值得注意,以防其他人处于这种情况。
router.post(
"/login",
passport.authenticate("local", {
failureRedirect: "/login",
failureFlash: true,
}),(req, res) {
res.redirect("/dashboard/" + req.user.username);
}
);
我省略了successRedirect
,因为成功登录无论如何都会运行路由功能;您所要做的就是考虑失败的登录尝试(即 failureRedirect
,或处理 401
状态代码),因为您可以使用现在存在的 req.user
重定向用户。