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 nextFunktion 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);
});