Express :如何将中间件独占添加到路由器对象中的大型路由列表中
Express : How to Add Middleware Exclusively to a Large List of Routes in a Router Object?
我想通过堆叠路由器对象来模块化我所有的路由。
我在堆叠路由器(使用索引初始化.js和跟踪路由器对象时遇到的问题 router.use
) 是当您想向特定路由器中的每个路由添加中间件调用(专门)但前提是路由列表很大 - 尝试将中间件放在路由前面以避免必须将其插入每个路由。
例如:将middleware.doSomething
应用于所有路由。
other.js
var express = require('express');
var router = express.Router();
var middleware = require("./middleware");
router.use(middleware.doSomething);
router.get('/routeC', function(req, res){
...
});
router.get('/routeD', function(req, res){
...
});
router.get('/routeE', function(req, res){
...
});
exports.module = router;
问题
一个路由器的中间件处理程序,如middleware.doSomething
可以意外地被调用,因为express经历了从通用到特定匹配路径的过程(例如。"/" 然后 "/routeA" 然后 "/routeA/:p aramA")。
例如:尝试处理"/routeA"时,路由器特定的中间件router.use(middleware.doSomething);
将被意外调用。
路线结构
/routes
-index.js
-other.js
索引.js
var express = require('express');
var router = express.Router();
router.use(require(./other));
router.get('/', function(req, res){
...
});
router.get('/routeA', function(req, res){
...
});
router.get('/routeB', function(req, res){
...
});
exports.module = router;
服务器.js
var routes = require('./routes');
app.use(routes);
问题:
我们如何使router.use(middleware.doSomething);
专用于它的路由器对象(不将其添加到每个单独的路由),或者通过设计/模式避免此问题,当我们堆叠额外的路由器时可以很好地扩展?(我对使用前缀的任何想法持开放态度,我只是避免它们,因为我也不想在 ajax 调用中添加前缀)。
我相信你可以,不仅仅是设计,还有你的代码模式,这是如何:
让我们假设你有这个主要.js
var app = require('express')();
// add universal middle ware
app.use(function(req,res,next){
console.log("universal");
next();
});
// lets assume you have 2 groups of routes, then you pass your express to them.
require('./route01.js')(app);
require('./route02.js')(app);
app.listen(4321);
让我们也假设这是一个 route01 组文件文件
module.exports = function(app)
{
// universal middleware for routes1
app.use('/route01',function(req, res, next){
console.log("universal middleware for routes1")
next();
});
app.get('/route01/option01',function(req,res,next){
console.log("specific middleware for route 1 option 1");
next();
},function(req,res){res.send("OK")});
app.get('/route01/option02',function(req,res,next){
console.log("specific middleware for route 1 option 2");
next();
},function(req,res){res.send("OK")});
}
这是 route02 组文件文件
module.exports = function(app)
{
// universal middleware for routes2
app.use('/route02',function(req, res, next){
console.log("universal middleware for routes2")
next();
});
// pass specific middle ware for the routes
app.get('/route02/option01',function(req,res,next){
console.log("specific middleware for route 2 option 1");
next();
},function(req,res){res.send("OK")});
app.get('/route02/option02',function(req,res,next){
console.log("specific middleware for route 2 option 2");
next();
},function(req,res){res.send("OK")});
}
例如,您按 http://127.0.0.1:4321/route01/option02,输出将是
普遍
路由的通用中间件1
路由 1 选项 2 的特定中间件
例如,如果击中 http://127.0.0.1:4321/route02/option01,你会得到
普遍
路由的通用中间件2
路由 2 选项 1 的特定中间件
- 引用对象中的通用值
- jQuery匹配JSON对象的部分文本
- 节点导出返回一个空对象
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- 快递之间的区别.路由器() vs 多个 express() 对象
- 如何使用UI路由器将对象传递到状态
- 通过当前路由器's模型转换为Ember.js中创建的对象
- 无法读取流星中对象的属性's iron路由器's路线
- 选择基于 UI 路由器 URL 的 JSON 对象
- Express :如何将中间件独占添加到路由器对象中的大型路由列表中
- Jade从路由器传递对象/数组时出错
- angular ui路由器更改$state.go()上的数据对象
- UI路由器可以't将解析的对象注入控制器
- 可以't将ui路由器解析对象中的变量解析到控制器中
- Angular UI路由器-尽管$stateParams获取对象,但不填充参数
- 如何解决错误对象#<没有方法'路由器'在node . js
- 如何将json对象从控制器传递到路由器
- React路由器-动态路由-通过路由器访问状态对象
- Express:路由器对象和方法
- 如何在主干JS的另一个html页面上重用路由器对象