gpt4 book ai didi

javascript - 从快速中间件中排除路由

转载 作者:IT老高 更新时间:2023-10-28 22:05:49 25 4
gpt4 key购买 nike

我有一个 Node 应用程序,就像防火墙/调度程序一样位于其他微服务前面,它使用如下中间件链:

...
app.use app_lookup
app.use timestamp_validator
app.use request_body
app.use checksum_validator
app.use rateLimiter
app.use whitelist
app.use proxy
...

但是对于特定的 GET 路由,我想跳过除 rateLimiter 和代理之外的所有路由。他们是一种使用 :except/:only 设置像 Rails before_filter 这样的过滤器的方法吗?

最佳答案

即使 expressjs 中没有内置的中间件过滤系统,你至少可以通过两种方式实现。

第一种方法是挂载所有要跳到正则表达式路径的中间件,而不是包含否定查找:

// Skip all middleware except rateLimiter and proxy when route is /example_route
app.use(/\/((?!example_route).)*/, app_lookup);
app.use(/\/((?!example_route).)*/, timestamp_validator);
app.use(/\/((?!example_route).)*/, request_body);
app.use(/\/((?!example_route).)*/, checksum_validator);
app.use(rateLimiter);
app.use(/\/((?!example_route).)*/, whitelist);
app.use(proxy);

第二种方法,可能更易读、更简洁,是用一个小的辅助函数包装你的中间件:

var unless = function(path, middleware) {
return function(req, res, next) {
if (path === req.path) {
return next();
} else {
return middleware(req, res, next);
}
};
};

app.use(unless('/example_route', app_lookup));
app.use(unless('/example_route', timestamp_validator));
app.use(unless('/example_route', request_body));
app.use(unless('/example_route', checksum_validator));
app.use(rateLimiter);
app.use(unless('/example_route', whitelist));
app.use(proxy);

如果你需要比简单的path === req.path更强大的路由匹配,你可以使用path-to-regexp module Express 内部使用。

UPDATE :- 在 express 4.17 req.path 只返回 '/',所以使用 req.baseUrl :

var unless = function(path, middleware) {
return function(req, res, next) {
if (path === req.baseUrl) {
return next();
} else {
return middleware(req, res, next);
}
};
};

关于javascript - 从快速中间件中排除路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27117337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com