Exclude route from express middleware(从快速中间件中排除路由)
问题描述
我有一个节点应用程序,就像防火墙/调度程序一样位于其他微服务前面,它使用如下中间件链:
I have a node app sitting like a firewall/dispatcher in front of other micro services and it uses a middleware chain like below:
...
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 这样的过滤器的方法吗?
However for a particular GET route I want to skip all of them except rateLimiter and proxy. Is their a way to set a filter like a Rails before_filter using :except/:only?
推荐答案
虽然expressjs没有内置中间件过滤系统,但至少可以通过两种方式实现.
Even though there is no build-in middleware filter system in expressjs, you can achieve this in at least two ways.
第一种方法是挂载所有要跳到正则表达式路径的中间件,而不是包含否定查找:
First method is to mount all middlewares that you want to skip to a regular expression path than includes a negative lookup:
// 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);
第二种方法,可能更易读、更简洁,是用一个小的辅助函数包装你的中间件:
Second method, probably more readable and cleaner one, is to wrap your middleware with a small helper function:
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 模块.
If you need more powerfull route matching than simple path === req.path
you can use path-to-regexp module that is used internally by Express.
UPDATE :- 在 express 4.17
req.path
只返回 '/',所以使用 req.baseUrl
:
UPDATE :- In express 4.17
req.path
returns only '/', so use req.baseUrl
:
var unless = function(path, middleware) {
return function(req, res, next) {
if (path === req.baseUrl) {
return next();
} else {
return middleware(req, res, next);
}
};
};
这篇关于从快速中间件中排除路由的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:从快速中间件中排除路由
基础教程推荐
- 动态更新多个选择框 2022-01-01
- 悬停时滑动输入并停留几秒钟 2022-01-01
- 我什么时候应该在导入时使用方括号 2022-01-01
- 角度Apollo设置WatchQuery结果为可用变量 2022-01-01
- 在for循环中使用setTimeout 2022-01-01
- 响应更改 div 大小保持纵横比 2022-01-01
- 有没有办法使用OpenLayers更改OpenStreetMap中某些要素 2022-09-06
- 当用户滚动离开时如何暂停 youtube 嵌入 2022-01-01
- Karma-Jasmine:如何正确监视 Modal? 2022-01-01
- 在 JS 中获取客户端时区(不是 GMT 偏移量) 2022-01-01