对于除一个控制器以外的所有其他应用程序使用快速中间件功

我有几个文件中的控制器的应用程序,如下所示:

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 

我有这样的中间件function…

 app.use(function (req, res, next) { // do a middleware thing // but not if route == x or y or z or ... yuck! }); 

而且我希望这个中间件可以运行在除了 aRoutes 之外的所有设备上。 我已经看到了这样的答案,这意味着在每个要排除的路由中添加一个中间件fn的检查,但是我认为这太糟糕了。 可能有很多路由需要检查,当我添加其中一条exception路由时,它迫使我在两处触及代码。

一定有更好的办法吧?

假设我正确地理解了你,你可以通过重新排列中间件和路由的顺序来解决它。

 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 

现在,如果使用res.render或其他一些结束请求 – 响应循环而不是使用next()其他操作来结束res.render ,则中间件将永远不会运行在aRoutes

然而它将在所有其他路线上运行。 这当然只有在您希望中间件启动请求 – 响应循环时才有效。 如果你想在其他地方,你必须相应地重新排列代码。