Node.js 在express中选择性地应用中间件

Node.js 在express中选择性地应用中间件,node.js,express,middleware,Node.js,Express,Middleware,我的路由器中有一个路由/users作为父后缀,所有后续路由将附加父后缀,例如/users/details 在我的app.js中 app.use('/api/v1/users', userRoutes); 在我的用户路线中 import express from 'express'; import users from '../controllers/user_controller'; import { authenticateRoute, authenticateSignedRoute, a

我的路由器中有一个路由
/users
作为父后缀,所有后续路由将附加父后缀,例如
/users/details

在我的app.js中

app.use('/api/v1/users', 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中间件添加到父前缀路由,然后对于一个特定路由,只有第三个中间件应用,而不是前两个

例如 应用程序使用('/api/v1/users',authenticateRoute,aclAuthenticator,userRoutes)

我的新路由器文件

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

我基本上是在试图超越最初的中间件,这可能吗?

我知道的唯一方法是将前两个中间件直接应用到路由器,而不使用路径前缀:

router.use(middleware1, middleware2);
然后,在每一个中间件中,检查URL的路径,如果它是您想要跳过这些中间件的特殊路径,那么只需调用
next()

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

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

前两个中间软件将跳过您希望它们跳过的中间软件,第三个中间软件只会因您的特定路由而被调用。

我知道的唯一方法是将前两个中间软件直接应用于您的路由器,而不使用路径前缀:

router.use(middleware1, middleware2);
然后,在每一个中间件中,检查URL的路径,如果它是您想要跳过这些中间件的特殊路径,那么只需调用
next()

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

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

前两个中间件将跳过您希望它们跳过的中间件,第三个中间件将只针对您的特定路由被调用。

这就是我显式禁用特定路由中间件的方式

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

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

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

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

当然,如果您使用的是动态路由,您可能需要更改代码。。但这并不难。

这会不会让代码变得非常混乱,基于路由的检查会造成混乱。也必须通过正则表达式完成。如果我有一个路径
/user/1
,这将一直保持正确的变化。?@NitishPhanse-对于您所描述的,它将是两条路径中添加的一行代码(请参阅我在回答中添加的代码行)。路由定义是包容性的,而不是排他性的,所以我不知道你会怎么做。一个更简洁的解决方法是修复你的URL设计,这样你就不会在一开始就造成这种情况,这样middleware3就更容易与middleware1和middleware2分离(就像在一个完全独立的路由器上)。完全同意你的观点。我只是想知道,如果例外列表增长到10个URL,那么我将不得不处理一个数组。您建议使用什么url结构来处理此问题?@NitishPhanse-如果需要不同中间件的url具有不同的路径根,那么很容易将不同的中间件定位于它们。我不知道你的URL/站点是如何构造的,以提供比这更具体的东西。这会不会让代码变得非常混乱,基于路由的检查会造成混乱。也必须通过正则表达式完成。如果我有一个路径
/user/1
,这将一直保持正确的变化。?@NitishPhanse-对于您所描述的,它将是两条路径中添加的一行代码(请参阅我在回答中添加的代码行)。路由定义是包容性的,而不是排他性的,所以我不知道你会怎么做。一个更简洁的解决方法是修复你的URL设计,这样你就不会在一开始就造成这种情况,这样middleware3就更容易与middleware1和middleware2分离(就像在一个完全独立的路由器上)。完全同意你的观点。我只是想知道,如果例外列表增长到10个URL,那么我将不得不处理一个数组。您建议使用什么url结构来处理此问题?@NitishPhanse-如果需要不同中间件的url具有不同的路径根,那么很容易将不同的中间件定位于它们。我不知道您的URL/站点是如何构造的,以提供比这更具体的内容。@Nitishhanse是的,您可以。在这种情况下,如果不满足条件,您将如何链接中间件。或者,如果在每个middlewareJust链中添加此检查,就像您通常链接其他中间件一样,您也可以全局应用此检查,这样中间件将针对所有路由而不是排除的路由运行。。您也可以执行相反的操作,这样它将仅在url存在于数组中时运行,否则它将被忽略。做最适合你需要的事情。@Nitishhanse是的,你可以。在这种情况下,如果不满足条件,你将如何连锁中间产品。或者,如果在每个middlewareJust链中添加此检查,就像您通常链接其他中间件一样,您也可以全局应用此检查,这样中间件将针对所有路由而不是排除的路由运行。。您也可以执行相反的操作,这样它将仅在url存在于数组中时运行,否则它将被忽略。做最适合你需要的事。