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存在于数组中时运行,否则它将被忽略。做最适合你需要的事。