Middleware
Ich bin auf halbem Weg, das Konzept der Middleware in einem neuen Projekt zu trennen.
Mit Middleware können Sie einen Stapel von Aktionen definieren, die Sie durchlaufen sollen. Express-Server selbst sind ein Stapel von Middleware.
// express
var app = express();
// middleware
var stack = middleware();
Anschließend können Sie dem Middleware-Stack durch Aufrufen Ebenen hinzufügen .use
// express
app.use(express.static(..));
// middleware
stack.use(function(data, next) {
next();
});
Eine Schicht im Middleware-Stack ist eine Funktion, die n Parameter (2 für Express, req
& res
) und eine next
Funktion akzeptiert.
Middleware erwartet, dass die Schicht einige Berechnungen durchführt, die Parameter erweitert und dann aufruft next
.
Ein Stapel macht nichts, wenn Sie nicht damit umgehen. Express verarbeitet den Stapel jedes Mal, wenn eine eingehende HTTP-Anforderung auf dem Server abgefangen wird. Mit Middleware behandeln Sie den Stack manuell.
// express, you need to do nothing
// middleware
stack.handle(someData);
Ein vollständigeres Beispiel:
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 Express-Begriffen definieren Sie einfach einen Stapel von Operationen, die Express für jede eingehende HTTP-Anforderung verarbeiten soll.
In Bezug auf Express (anstatt Verbindung) verfügen Sie über globale Middleware und routenspezifische Middleware. Dies bedeutet, dass Sie einen Middleware-Stack an alle eingehenden HTTP-Anforderungen anhängen oder ihn nur an HTTP-Anforderungen anhängen können, die mit einer bestimmten Route interagieren.
Erweiterte Beispiele für Express- und 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);
});