middleware
Sono a metà strada nel separare il concetto di middleware in un nuovo progetto.
Il middleware consente di definire una serie di azioni da attraversare. I server Express stessi sono una pila di software.
// express
var app = express();
// middleware
var stack = middleware();
Quindi è possibile aggiungere layer allo stack del middleware chiamando .use
// express
app.use(express.static(..));
// middleware
stack.use(function(data, next) {
next();
});
Un livello nello stack del middleware è una funzione, che accetta n parametri (2 per express, req
& res
) e una next
funzione.
Il middleware prevede che il layer esegua alcuni calcoli, aumenti i parametri e quindi chiami next
.
Uno stack non fa nulla a meno che tu non lo gestisca. Express gestirà lo stack ogni volta che una richiesta HTTP in arrivo viene catturata sul server. Con il middleware gestisci lo stack manualmente.
// express, you need to do nothing
// middleware
stack.handle(someData);
Un esempio più 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
})
In termini espressivi è sufficiente definire una serie di operazioni che si desidera che express gestisca per ogni richiesta HTTP in arrivo.
In termini di express (piuttosto che di connessione) hai un middleware globale e instrada middleware specifico. Ciò significa che è possibile collegare uno stack di middleware a tutte le richieste HTTP in entrata o collegarlo solo a richieste HTTP che interagiscono con una determinata route.
Esempi avanzati di express e 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);
});