oprogramowanie pośrednie
Jestem w połowie drogi do rozdzielenia koncepcji oprogramowania pośredniego w nowym projekcie.
Oprogramowanie pośrednie pozwala zdefiniować stos działań, przez które należy przejść. Same serwery ekspresowe to stos oprogramowania pośredniego.
// express
var app = express();
// middleware
var stack = middleware();
Następnie możesz dodać warstwy do stosu oprogramowania pośredniego, wywołując .use
// express
app.use(express.static(..));
// middleware
stack.use(function(data, next) {
next();
});
Warstwa w stosie oprogramowania pośredniego to funkcja, która przyjmuje n parametrów (2 dla express, req
& res
) i next
funkcję.
Oprogramowanie pośrednie oczekuje, że warstwa wykona pewne obliczenia, zwiększy parametry, a następnie wywoła next
.
Stos nic nie robi, chyba że sobie z tym poradzisz. Express obsłuży stos za każdym razem, gdy przychodzące żądanie HTTP zostanie przechwycone na serwerze. Dzięki oprogramowaniu pośredniczemu możesz ręcznie obsługiwać stos.
// express, you need to do nothing
// middleware
stack.handle(someData);
Bardziej kompletny przykład:
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
})
W kategoriach ekspresowych po prostu definiujesz stos operacji, które ekspres ma obsługiwać dla każdego przychodzącego żądania HTTP.
Jeśli chodzi o ekspresowe (zamiast łączenia), masz globalne oprogramowanie pośrednie i konkretne oprogramowanie pośredniczące dla trasy. Oznacza to, że możesz dołączyć stos oprogramowania pośredniego do każdego przychodzącego żądania HTTP lub dołączyć go tylko do żądań HTTP, które wchodzą w interakcję z określoną trasą.
Zaawansowane przykłady ekspresowego i oprogramowania pośredniego:
// 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);
});