在express中有选择地应用中间件

时间:2017-02-16 15:54:42

标签: node.js express middleware

我的路由器中有一条路由/users作为父后缀,所有后续路由都会附加父路由,例如。 /users/details

在我的app.js

app.use('/api/v1/users', userRoutes);

在我的userRoutes

import express from 'express';
import users from '../controllers/user_controller';

import { authenticateRoute, authenticateSignedRoute, aclAuthenticator } from './../middlewares/AuthenticationMiddleware';

const router = express.Router();


//user routes
router.get('/details', authenticateRoute, aclAuthenticator, users.getDetails);
router.get('/posts', authenticateRoute, aclAuthenticator, users.getPosts);


module.exports = router;

我想做什么

我有没有办法将authenticateRoute和aclAuthenticator中间件添加到父前缀路由,然后对于一个特定路由有一个例外,其中只应用了第三个中间件而不是前两个。

例如     app.use('/ api / v1 / users',authenticateRoute,aclAuthenticator,userRoutes);

我的新路由器文件

router.get('/details', applyOnlyThisMiddleWare, users.getDetails);
router.get('/posts', No MiddleWareAtAll, users.getPosts);

我基本上试图覆盖最初的中间件,这可能吗?

2 个答案:

答案 0 :(得分:1)

我知道这样做的唯一方法是将前两个中间件直接应用到没有路径前缀的路由器:

router.use(middleware1, middleware2);

然后,在每个中间件中,检查URL的路径,如果它是您要跳过这些中间件的特殊路径,则只需调用next()

if (req.path.indexOf("/somepath") === 0) { return next() };

然后,您只能为您感兴趣的路径注册第三个中间件:

router.use("/somepath", middleware3);

前两个middewares将跳过你想要跳过的那些,而第三个只会被你的特定路径调用。

答案 1 :(得分:1)

这就是我明确禁用特定路由的中间件的方法

'use strict';

const ExpressMiddleware = ( req, res, next ) => {

    // dont run the middleware if the url is present in this array
    const ignored_routes = [
        '/posts',
        '/random-url',
    ];

    // here i am checking for request method as well, you can choose to remove this
    // if( ! ignored_routes.includes(req.path) ) {
    if( req.method === 'GET' && ! ignored_routes.includes(req.path) ) {
        // do what you gotta do.
        // next();
    }
    else {
        next();
    }

}


export default ExpressMiddleware;

在您的服务器/路线文件中

app.use( ExpressMiddleware );

当然,如果您使用动态路线,则可能需要更改代码..但这并不困难。