【问题标题】:expressjs conditional redirectexpressjs 条件重定向
【发布时间】:2013-06-25 20:41:39
【问题描述】:

我正在尝试编写用于身份验证的中间件。如果用户已登录,我希望此 if 语句将用户重定向到 '/'。如果他们已登录,我不想将他们重定向到“/news”。

/*Simplified for this example*/

if(rs.authenticated === true) {
    next();
} else {
    res.redirect('/');
}

有没有办法在这些 if 语句中做到这一点?还是我必须写一个新方法?我已经尝试了几种使用 if 语句的方法,但我只是得到了重定向循环。

【问题讨论】:

    标签: javascript redirect express


    【解决方案1】:

    标准模式适用于所有需要登录用户使用中间件的页面,该中间件验证登录用户并在未登录时重定向到/

    function loggedIn(req, res, next) {
      if(req.authenticated === true) {
        next();
      } else {
        res.redirect('/');
      }
    }
    
    app.get('/news', loggedIn, newsRoute);
    app.get('/', homeRoute);
    

    您的问题是您对所有路由都使用了中间件,而您实际上只想将它用于受保护的路由,而这正是您的重定向循环发生的地方。如果您想将登录用户发送到“/news”而不是“/”,您可以只呈现正确的模板或在那里进行条件重定向。

    function homeRoute(req, res) {
      if (req.authenticated) {
          return res.redirect('/news');
      }
      res.render('home');
    }
    

    【讨论】:

    • 我的示例中的 if 语句实际上来自一个方法(我将它用于受保护的路由,auth.restrict),并且我还有另一种称为logged_in 的方法,用于非受保护的路由,所以如果它们是例如,已经登录他们会被重定向到“/news”,而不是停留在登录页面。我只是在想我是否可以对所有路线使用一种方法。但也许使用两种不同的方法是更好的选择?
    • 嗯,你需要逻辑来避免重定向循环,所以你要么需要检查req.path,并且如果他们还没有请求'/',则只将它们重定向到'/',或者跟随我的建议。
    • 如果我只是渲染视图,而不是重定向,则不会有数据传递给它。有办法解决吗?
    • 很抱歉我没有把这个问题想通。这是关于重用代码。但那是一个单独的主题,所以我会为此发布一个新问题。谢谢
    • 如果您想让某些路由有效地与另一个路由相同而不需要重定向(可能基于条件逻辑),请将您的路由处理程序设置为命名函数并调用它:app.get('/', function (req, res, next) {newsRoute(req, res, next);});
    【解决方案2】:

    您想引入一个小型中间件来检查用户是否登录。您在路由处理程序级别设置它。

    请查看那些 SO 答案:

    javascript node.js next()

    How does Express/Connect middleware work?

    What is the parameter "next" used for in Express?

    【讨论】:

    • 没有足够的内容在答案本身有用 - 链接可能会过时。 OP 说他们已经在使用中间件了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    相关资源
    最近更新 更多