middleware
Estou na metade da separação do conceito de middleware em um novo projeto.
O middleware permite definir uma pilha de ações pelas quais você deve fluir. Os servidores Express são uma pilha de middlewares.
// express
var app = express();
// middleware
var stack = middleware();
Em seguida, você pode adicionar camadas à pilha de middleware chamando .use
// express
app.use(express.static(..));
// middleware
stack.use(function(data, next) {
next();
});
Uma camada na pilha de middleware é uma função, que recebe n parâmetros (2 para express, req
& res
) e uma next
função.
O middleware espera que a camada faça alguns cálculos, aumente os parâmetros e depois chame next
.
Uma pilha não faz nada, a menos que você lide com ela. O Express manipula a pilha toda vez que uma solicitação HTTP recebida é capturada no servidor. Com o middleware, você lida com a pilha manualmente.
// express, you need to do nothing
// middleware
stack.handle(someData);
Um exemplo mais 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
})
Em termos expressos, você apenas define uma pilha de operações que deseja expressar para cada solicitação HTTP recebida.
Em termos de expresso (em vez de conexão), você possui um middleware global e encaminha um middleware específico. Isso significa que você pode anexar uma pilha de middleware a todas as solicitações HTTP recebidas ou apenas anexá-las a solicitações HTTP que interagem com uma determinada rota.
Exemplos avançados de express & 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);
});