middleware
Estoy a medio camino de separar el concepto de middleware en un nuevo proyecto.
Middleware le permite definir una pila de acciones por las que debe pasar. Los servidores Express son una pila de middlewares.
// express
var app = express();
// middleware
var stack = middleware();
Luego puede agregar capas a la pila de middleware llamando .use
// express
app.use(express.static(..));
// middleware
stack.use(function(data, next) {
next();
});
Una capa en la pila de middleware es una función, que toma n parámetros (2 para express, req
& res
) y una next
función.
Middleware espera que la capa haga algunos cálculos, aumente los parámetros y luego llame next
.
Una pila no hace nada a menos que la manejes. Express manejará la pila cada vez que una solicitud HTTP entrante sea atrapada en el servidor. Con middleware manejas la pila manualmente.
// express, you need to do nothing
// middleware
stack.handle(someData);
Un ejemplo más completo:
var middleware = require("../src/middleware.js");
var stack = middleware(function(data, next) {
data.foo = data.data*2;
next();
}, function(data, next) {
setTimeout(function() {
data.async = true;
next();
}, 100)
}, function(data) {
console.log(data);
});
stack.handle({
"data": 42
})
En términos expresos, simplemente define una pila de operaciones que desea que express maneje para cada solicitud HTTP entrante.
En términos de express (en lugar de conectar), tiene middleware global y middleware específico de ruta. Esto significa que puede adjuntar una pila de middleware a cada solicitud HTTP entrante o solo adjuntarla a solicitudes HTTP que interactúen con una ruta determinada.
Ejemplos avanzados de express y middleware:
// middleware
var stack = middleware(function(req, res, next) {
users.getAll(function(err, users) {
if (err) next(err);
req.users = users;
next();
});
}, function(req, res, next) {
posts.getAll(function(err, posts) {
if (err) next(err);
req.posts = posts;
next();
})
}, function(req, res, next) {
req.posts.forEach(function(post) {
post.user = req.users[post.userId];
});
res.render("blog/posts", {
"posts": req.posts
});
});
var app = express.createServer();
app.get("/posts", function(req, res) {
stack.handle(req, res);
});
// express
var app = express.createServer();
app.get("/posts", [
function(req, res, next) {
users.getAll(function(err, users) {
if (err) next(err);
req.users = users;
next();
});
}, function(req, res, next) {
posts.getAll(function(err, posts) {
if (err) next(err);
req.posts = posts;
next();
})
}, function(req, res, next) {
req.posts.forEach(function(post) {
post.user = req.users[post.userId];
});
res.render("blog/posts", {
"posts": req.posts
});
}
], function(req, res) {
stack.handle(req, res);
});