我有一个带有多个文件控制器的应用程序,如下所示:
var aRoutes = require('./controllers/controllerA');
var bRoutes = require('./controllers/controllerB');
var cRoutes = require('./controllers/controllerC');
app.use('/a', aRoutes);
app.use('/b', bRoutes);
app.use('/c', cRoutes);
// ... several more
我有这样的中间件功能......
app.use(function (req, res, next) {
// do a middleware thing
// but not if route == x or y or z or ... yuck!
});
我希望中间件可以运行除了 aRoutes之外的所有内容。我已经看到了一个答案like this,它建议在中间件fn中为每个要排除的路径添加一个检查,但这很糟糕,我想。可能有很多路由需要检查,当我添加其中一个异常路由时,它会强迫我在两个地方触摸代码。
必须有更好的方法,对吧?
答案 0 :(得分:1)
假设我理解正确,你可以通过重新排列中间件和路由的顺序来解决它。
<fr:tab>
现在,如果您使用var aRoutes = require('./controllers/controllerA');
var bRoutes = require('./controllers/controllerB');
var cRoutes = require('./controllers/controllerC');
app.use('/a', aRoutes);
app.use('/',function (req, res, next) {
// do a middleware thing
next();
});
app.use('/b', bRoutes);
app.use('/c', cRoutes);
// ... several more
结束aRoutes
或结束请求 - 响应周期而不是res.render
的其他操作,则中间件将永远不会在next()
上运行{1}}。
然而,它将在所有其他路线上运行。这当然只有在您希望中间件启动请求 - 响应周期时才有效。如果你想在其他地方使用它,你必须相应地重新安排代码。