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

如果在Express中不满足条件,如何重定向除两条以外的所有路径,express,nodejs-server,Express,Nodejs Server,在我的express服务器上,我尝试实现以下逻辑: 如果路径不是/Login或/Register 并且request.session.authenticated不正确 将所有请求重定向到/Login 换句话说,伪代码: function() { if (req.session.authenticated !== true && path !== '/Login') res.redirect('/Login') }

在我的express服务器上,我尝试实现以下逻辑:

  • 如果路径不是/Login或/Register

  • 并且request.session.authenticated不正确

  • 将所有请求重定向到/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, 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()
        }
    }
    

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

    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
    });
    

    如果我执行类似app.use(redirect())的操作,服务器会为传入的每个HTTP请求运行该函数吗?是的,它会这样工作,我认为它应该没有()但是您可以尝试两种方法。如果这个用法有问题,而不是返回,你可以编写next(),看看我的编辑,出于某种原因,我没有访问请求的权限。你是否尝试过这样使用它:app.use(redirect)是的,但它不起作用,因为如果我这样做,它不会调用函数。