middleware
Je suis à mi-chemin de la séparation du concept de middleware dans un nouveau projet.
Le middleware vous permet de définir une pile d'actions que vous devez parcourir. Les serveurs express eux-mêmes sont une pile de middlewares.
// express
var app = express();
// middleware
var stack = middleware();
Ensuite, vous pouvez ajouter des couches à la pile du middleware en appelant .use
// express
app.use(express.static(..));
// middleware
stack.use(function(data, next) {
next();
});
Une couche dans la pile du middleware est une fonction, qui prend n paramètres (2 pour express, req
& res
) et une next
fonction.
Le middleware attend de la couche qu'elle effectue des calculs, augmente les paramètres puis appelle next
.
Une pile ne fait rien sauf si vous la manipulez. Express gérera la pile chaque fois qu'une requête HTTP entrante est interceptée sur le serveur. Avec le middleware, vous gérez la pile manuellement.
// express, you need to do nothing
// middleware
stack.handle(someData);
Un exemple plus complet:
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 termes express, vous définissez simplement une pile d'opérations que vous souhaitez que express gère pour chaque requête HTTP entrante.
En termes d'express (plutôt que de connexion), vous avez un middleware global et un middleware spécifique à l'itinéraire. Cela signifie que vous pouvez attacher une pile de middleware à toutes les demandes HTTP entrantes ou la joindre uniquement aux demandes HTTP qui interagissent avec une certaine route.
Exemples avancés d'express et 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);
});