javascript - Express 中的中间件链接
问题描述
我正在编写 API,并想了解添加由多个路由共享的中间件的好方法。中间件在每个路由中执行相同的操作,例如验证主机/IP、验证用户等。 req 对象与每个中间件中的其他对象一起加载,例如 req.host、req.ip、req.username 等。
app.post("/route1", middleware1, middleware2, middleware3, middleware4);
app.post("/route2", middleware1, middleware2, middleware3, middleware4);
const middleware1 = (req, res, next) => {
// does something to validate user
req.username = "username"
next();
}
const middleware2 = (req, res, next) => {
// host validation
req.host = "something modified in validation"
next();
}
const middleware3 = (req, res, next) => {
// checks for mac and ip
req.mac = "mac addr"
next();
}
const middleware4 = (req, res, next) => {
res.send();
}
或者是这样的:
app.post("/route1", middleware1);
app.post("/route2", middleware1);
const middleware1 = (req, res) => {
// does something to validate user
req.username = "username"
middleware2(req, res);
}
const middleware2 = (req, res) => {
// host validation
req.host = "something modified in validation"
middleware3(req, res);
}
const middleware3 = (req, res) => {
// checks for mac and ip
req.mac = "mac addr"
middleware4(req, res);
}
const middleware1 = (req, res) => {
res.send();
}
谢谢。
解决方案
通常我不会直接从另一个中间件调用中间件。它混合了中间件逻辑的职责和中间件的使用位置。
Express 的可配置性比您想象的要高得多。您还可以在常用路径中安装常用中间件:
如果所有路由都使用中间件:
// How common middlewares are normally installed: app.post(middleware1); app.post(middleware2); app.post(middleware3); app.post(middleware4); // Alternative, less common way to do it: app.post(middleware1,middleware2,middleware3,middleware4);
如果只有特定的 url模式使用中间件:
// Use a regexp: app.post(/route(1|2)/, middleware1, middleware2, middleware3, middleware4); // Or if you don't like regexp, use globs: app.post('route*', middleware1, middleware2, middleware3, middleware4); // Or a more specific glob pattern: app.post('route1?2?', middleware1, middleware2, middleware3, middleware4);
如果子路径中的所有 url 都使用中间件。例如,假设所有 url 都在
/route/...
使用中间件:const route = express.Router(); app.use('/route',route); route.post(middleware1); route.post(middleware2); route.post(middleware3); route.post(middleware4);
如果以上都不吸引您,您仍然可以使用您的第二个选项,但不是在彼此内部调用中间件,而是编写一个中间件来初始化中间件:
function commonMiddlewares (req, res, next) {
middleware1(req,res,function() {
middleware2(req,res,function() {
middleware3(req,res,function() {
middleware4(req,res,next);
});
});
});
}
可以用较少嵌套的方式编写:
function commonMiddlewares (req, res, next) {
function runMiddleware4 () {
middleware4(req,res,next);
}
function runMiddleware3 () {
middleware3(req,res,runMiddleware4);
}
function runMiddleware2 () {
middleware2(req,res,runMiddleware3);
}
middleware1(req,res,runMiddleware2);
}
推荐阅读
- search - SOLR 按找到的分组 num 排序
- microsoft-graph-api - 任何识别附加文件的方法都受密码保护或不使用 Graph API
- javascript - 想要显示带有点击事件 javascript 的标签
- scala - 如何确保给定的未来在测试中首先完成?
- d3.js - D3.js 在刻度线上动态切换数字和美元格式
- android - Android 服务启动布局
- hash - 小多字符集的完美散列函数
- flutter - 如何防止 Listview 在某些范围之间滚动?
- ios - 在 Swift 表格视图中创建自定义分隔符
- sql - 德国归类比较为 Nvarchar