我有一个中间件(gateMan)来检查用户是否已登录,我不希望该中间件(gateMan)在所有路由上触发。但是,它将在我的98%的路由上触发,如何在不调用每个路由的中间件的情况下实现这一目标。
中间件
const gateMan = (req,res,next)=>{
if(req.user)
next();
else{
res.redirect('/auth/login');
res.end();
}
};
路线示例
app.use('/',staticRoute);
app.use('/auth',authRoute);
app.use('/user',gateMan,userRoute);
app.use('/mocks',gateMan,mockRoute);
app.use('/sample2',sample2Route);
app.use('/sample3',sample3Route);
app.use('/sample4',sample4Route);
我想将 gateMan 应用于除 staticRoute 和 authRoute 之外的所有路由。我在想是否有一种方法可以将所有路由传递给array并将中间件应用于它们,这怎么可能?
答案 0 :(得分:2)
您可以在应用程序文件中使用Express的app.use
。由于app.use
依赖顺序,因此您可以先定义staticRoute和authRoute,然后定义中间件,然后定义其他路由。
app.use('/',staticRoute);
app.use('/auth',authRoute);
app.use(gateMan)
app.use('/user',userRoute);
app.use('/mocks',mockRoute);
app.use('/sample2',sample2Route);
app.use('/sample3',sample3Route);
app.use('/sample4',sample4Route);
在gateman
中间件之后定义的所有路由都将使用该中间件。
答案 1 :(得分:0)
您可以使用app.all('*')
并检查内部使用的path
。在这里,您可以使用middleware
中的逻辑。这是一个非常动态的解决方案,您不必知道那里有哪些路由。
类似这样的东西(虽然未测试):
app.all('*', function(req, res, next) {
if (req.path !== '/' || req.path !== '/auth') {
if(req.user)
next()
else {
res.redirect('/auth/login')
res.end()
}
}
})
然后,您可以将所有未经授权的路径放在array
中,并检查app.all
是否在path
中。
类似的东西:
array