如何将中间件传递到Express Node.js中的指定路由

时间:2018-09-23 08:04:21

标签: javascript node.js express middleware

我有一个中间件(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并将中间件应用于它们,这怎么可能?

2 个答案:

答案 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

https://expressjs.com/en/4x/api.html#req.path

https://expressjs.com/en/4x/api.html#app.all