如果在 Express 中不满足条件,如何重定向除两个路径之外的所有路径

问题描述

在我的快速服务器上,我试图实现以下逻辑:

  1. 如果路径不是 /Login 或 /Register

  2. 而且 request.session.authenticated 不是真的。

  3. 将所有请求重定向到 /Login。

换句话说,伪代码

function()
    {
        if (req.session.authenticated !== true && path !== '/Login')
            res.redirect('/Login')
    }


如何使用 app.get() 或类似工具在 Express 中编写此函数

app.get( path,(req,res) => 
{
  // ??
})

------------------------------------------- 编辑后-- ------------------------

所以,我试过这个:

app.use(redirect())

function redirect(req,res,next) 
{
  if (req.session.authenticated !== true && req.path !== '/Login/Login.html' || req.session.authenticated !== true && req.path !== '/Register/Register.html') 
    {
      res.redirect('/Login/Login.html');
      return next()
    }
}

但是,我收到以下错误

  if (req.session.authenticated !== true && req.path !== '/Login/Login.html' || req.session.authenticated !== true && req.path !== '/Register/Register.html')
          ^

TypeError: Cannot read property 'session' of undefined

我猜由于某种原因,这个函数无法访问请求对象,这很奇怪。我怎样才能让它访问请求?我认为所有中间件功能都可以访问该请求。

------------------------------------第二次编辑--------- ---------------------------

在我的例子中,上面的中间件函数只有在你将它保存到一个变量然后使用 app.use() 调用保存函数的变量时才有效。

那就是:


app.use(redirectMe)

let redirectMe = function redirect(req,next) 
{
  if (req.session.authenticated !== true && req.path !== '/Login/Login.html' || req.session.authenticated !== true && req.path !== '/Register/Register.html') 
    {
      res.redirect('/Login/Login.html');
      return next()
    }
}

解决方法

您可以为此编写身份验证中间件之类的东西。

function redirect(req,res,next) {
        if (req.session.authenticated !== true && req.path !== '/Login' && req.path !== '/Register') {
            res.redirect('/Login');
            return
        }
    }

并且您只需要导出该函数,您就可以将其用作路由中的中间件。像这样:

app.get('/profile',redirect(),(req,res) => {
  //Some code here
});