【发布时间】:2016-06-12 11:35:07
【问题描述】:
我想通过堆叠路由器对象来模块化我的所有路由。
堆叠路由器的问题(使用 index.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/:paramA” )。
例如:当尝试处理“/routeA”时,路由器特定的中间件router.use(middleware.doSomething); 将被意外调用。
路由结构
/routes
-index.js
-other.js
index.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;
server.js
var routes = require('./routes');
app.use(routes);
问题:
我们如何将router.use(middleware.doSomething); 设为其路由器对象的私有(而不将其添加到每个单独的路由),或者通过在我们堆叠其他路由器时很好地扩展的设计/模式来避免这个问题? (我对使用前缀的任何想法持开放态度,我只是避免使用它们,因为我也不想为 ajax 调用添加前缀)。
【问题讨论】:
-
您的代码中是否有某些部分无法按您的意愿工作? middleware.doSomething 现在只有在你在 other.js 中点击路由时才会调用。
-
例如,如果您尝试路由到“/routeA”,
middleware.doSomething将被命中。 -
我的机器上没有你的代码。
-
什么?诡异的!您使用什么版本的节点/快递?按照设计,middlewar.doSomething 应该是其路由器对象 other.js 独有的吗?
-
node@v5.4.1,express@4.13.4。是的。当您将中间件添加到路由器时,它是专用的。对于一般中间件,您通常使用
app.use将其添加到 express 对象上
标签: javascript node.js express