在人们登录我的Express应用程序后,我想将它们重定向到以下网址:
www.mysite.com/:user
我遇到的问题是,当人们在登录后重新定向时,我的req.params
对象将作为空对象文字出现。
理想情况下,我想要以某种方式获取存储在req.user
中的信息,并将一些信息传递到URL中。
所以基本上我想从这里开始:
router.post('/login',
passport.authenticate('local', {successRedirect:'/', failureRedirect: '/login', failureFlash: true}));
到这里:
router.get('/:user', function(req, res) {
//stuff
}
登录后,req.user
对象的内容如下:
{
username: joesmith@mail.com,
name: Joe Smith,
password: dkei348#$kDL^583L,
formulas: []
}
我试图使用的代码如下:
router.get('/:user', function(req, res) {
var user = req.user.name;
req.params = {
"user": user
}
但这不起作用,因为如果有人尚未登录,则最初req.user.name
未定义,因此我无法通过控制台错误。
显然我不明白如何生成req.params
足够详细来解决这个问题。
谢谢。
答案 0 :(得分:1)
看起来您想要访问任何/:user
值。例如www.mysite.com/stretch0
。因此,您可以像var user = req.params.user;
答案 1 :(得分:1)
如果你想在参数中使用用户名,你应该重定向到'/' + req.user.name);
,因为'/'没有任何参数。这就是它未定义的原因。 (另外你要检查参数是否定义并处理错误,所以不是控制台错误而是错误404或者到达下一个正确的路由路径。)
Passport Documentation有关它的例子:
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('/' + req.username);
});
或更复杂的自定义回调:
app.get('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) { return next(err); }
if (!user) { return res.redirect('/login'); }
req.logIn(user, function(err) {
if (err) { return next(err); }
return res.redirect('/' + user.name);
});
})(req, res, next);
});
但我认为这不是一个好的做法,更安全的是通过req.user值重定向到正确的页面/内容而不将其放到URL中,例如设置req.auth。然后使用next();
而不是res.redirect('/' + user.name);
来访问下一个中间件。用户名将取自req.auth.username
,而不是/:username
。
您的路由结构如何?你应该确保router.get('/:user' ..
不在router.get('/login'..
之前。
答案 2 :(得分:1)
您可以提供自定义处理程序,而不是让Passport执行所有重定向:
app.post('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) {
req.flash('error', 'Unable to authenticate user');
return res.redirect('/login');
}
if (! user) {
return res.redirect('/login');
}
req.logIn(user, function(err) {
if (err) {
req.flash('error', 'Unable to log in user');
return res.redirect('/login');
}
return res.redirect('/' + user.username);
});
})(req, res, next);
});
这意味着每位登录用户都会获得“个人”网址,因为您正在重定向到/USERNAME
。我不确定你的问题是否真的是你的意图。