Proper way to remove middleware from the Express stack?

后端 未结 7 2119
时光说笑
时光说笑 2020-12-18 18:41

Is there a canonical way to remove middleware added with app.use from the stack? It seems that it should be possible to just modify the app.stack array directl

7条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-12-18 19:16

    There seems to be no built in way to do that, but you can manage to get the same result with a small trick. Create your own array of middleware (let's call it dynamicMiddleware) but don't push that into express, instead push just 1 middleware that will execute all the handlers in dynamicMiddleware asynchronously and in order.

    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()
                }
            }
        );
    })
    

    The code is a bit rough as I don't have a chance to test it right now, but the idea should be clear: wrap all dynamic handlers array in 1 middleware, that will loop through the array. And as you add or remove handlers to the array, only the ones left in the array will be called.

提交回复
热议问题