从Req.User()获取信息到ExpressJS中的Req.params()

时间:2017-07-06 03:39:47

标签: node.js express passport.js

在人们登录我的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足够详细来解决这个问题。

谢谢。

3 个答案:

答案 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。我不确定你的问题是否真的是你的意图。