问题描述
在我的快速服务器上,我试图实现以下逻辑:
-
如果路径不是 /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,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
});