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);
use
realmente proviene de Connect (no Express), y todo lo que realmente hace es empujar la función de middleware en la stack
la aplicación .
Así que deberías estar bien empalmando la función fuera de la matriz.
Sin embargo, tenga en cuenta que no hay documentación sobre app.stack
ni existe una función para eliminar el middleware. Corres el riesgo de que una futura versión de Connect realice cambios incompatibles con tu código.