node how create app node.js express connect

node.js - how - middleware node js



¿La forma correcta de eliminar middleware de la pila Express? (5)

¿Hay una forma canónica de eliminar el middleware agregado con app.use de la pila? Parece que debería ser posible simplemente modificar la matriz app.stack directamente , pero me pregunto si hay un método documentado que debería considerar primero.


Esta es una funcionalidad útil si está heredando cierto middleware no deseado de un marco construido en Express.

Sobre la base de algunas de las respuestas anteriores: en Express 4.x se puede encontrar el middleware en app._router.stack. Tenga en cuenta que el middleware se invoca en orden.

// app is your express service console.log(app._router.stack) // [Layer, Layer, Layer, ...]

Sugerencia: puede buscar las capas individuales por la que desea eliminar / mover

const middlewareIndex = app._router.stack.findIndex(layer => { // logic to id the specific middleware });

Luego puede simplemente moverlos / eliminarlos con métodos de matriz estándar como splice / unshift / etc

// Remove the matched middleware app._router.stack.splice(middlewareIndex, 1);


No hay manera de eliminar un middleware por lo que sé. sin embargo, puede asignar una bandera booleana para ''desactivar'' un middleware en cualquier momento que desee.

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

EDITAR:
Después de leer el código de ExpressJs (4.x), me doy cuenta de que puedes acceder a la pila de middlewares a través de app._router.stack , la manipulación va desde allí, supongo. Sin embargo, creo que este ''truco'' podría no funcionar en el futuro Express
P / s: no probado cómo se comporta Express cuando se manipula la pila de middlewares directamente aunque


Parece que no hay una forma integrada de hacerlo, pero puedes lograr el mismo resultado con un pequeño truco. Cree su propia matriz de middleware (llamémoslo dynamicMiddleware ) pero no dynamicMiddleware eso en Express, en su lugar, solo presione 1 middleware que ejecutará todos los manejadores en dynamicMiddleware forma asincrónica y en orden.

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

El código es un poco áspero, ya que no tengo la oportunidad de probarlo ahora, pero la idea debería ser clara: envolver toda la matriz de controladores dinámicos en 1 middleware, que pasará por la matriz. Y a medida que agregue o elimine controladores en la matriz, solo se llamarán los que queden en la matriz.


Puedes usar el middleware express-dynamic-middleware para hacer esto.

https://github.com/lanbomo/express-dynamic-middleware

Usalo asi

const express = require(''express''); // import express-dynamic-middleware const dynamicMiddleware = require(''express-dynamic-middleware''); // create auth middleware const auth = function(req, res, next) { if (req.get(''Authorization'') === ''Basic'') { next(); } else { res.status(401).end(''Unauthorization''); } }; // create dynamic middleware const dynamic = dynamicMiddleware.create(auth); // create express app const app = express(); // use the dynamic middleware app.use(dynamic.handle()); // unuse auth middleware dynamic.unuse(auth);