正确的方法从Express堆栈中删除中间件?

有没有一个规范的方式来删除从堆栈中添加app.use中间件? 似乎应该可以直接修改app.stack数组 ,但是我想知道是否有一个logging的方法,我应该首先考虑。

use实际上来自Connect(不是Express),而它所做的只是将中间件function推到应用程序的stack

所以你应该把数组中的函数拼接起来。

但是,请记住app.stack没有任何文档,也没有删除中间件的function。 您将面临未来版本的Connect的风险,使更改与您的代码不兼容。

似乎没有build立的方式来做到这一点,但你可以设法得到一个小窍门相同的结果。 创build你自己的中间件数组(我们称之为dynamicMiddleware ),但不要将其推到express中,而是只推送1个中间件,它将asynchronous执行dynamicMiddleware所有处理程序。

 const async = require('async') // Middleware const m1 = (req, res, next) => { // do something here next(); } const m2 = (req, res, next) => { // do something here next(); } const m3 = (req, res, next) => { // do something here next(); } let dynamicMiddleware = [m1, m2, m3] app.use((req, res, next) => { // execute async handlers one by one async.eachSeries( // array to iterate over dynamicMiddleware, // iteration function (handler, callback) => { // call handler with req, res, and callback as next handler(req, res, callback) }, // final callback (err) => { if( err ) { // handle error as needed } else { // call next middleware next() } } ); }) 

代码有点粗糙,因为我现在没有机会testing它,但是这个想法应该很清楚:将所有dynamic处理程序数组包装在1个中间件中,这将循环访问数组。 而当你向数组中添加或移除处理程序时,只会调用数组中剩下的那些。

据我所知,没有办法去除中间件。 但是,您可以在任何时候指定布尔标志来“停用”中间件。

 var middlewareA_isActivate = true; //Your middleware code function(req, res, next) { if (!middlewareA_isActivate) next(); //......... } //Deactivate middleware middlewareA_isActivate = false; 

编辑:
通过ExpressJs(4.x)代码阅读后,我注意到你可以通过app._router.stack访问中间件堆栈,操纵从那里我猜。 不过,我认为这个“技巧”可能无法在未来的Express中运行
P / s:虽然没有testingExpress如何直接操作中间件堆栈