промежуточный слой
Я на полпути к разделению концепции промежуточного программного обеспечения в новом проекте.
Промежуточное программное обеспечение позволяет вам определять стек действий, которые вы должны выполнять. Экспресс-серверы сами по себе представляют собой связующее ПО.
// express
var app = express();
// middleware
var stack = middleware();
Затем вы можете добавить слои в стек промежуточного программного обеспечения, вызвав .use
// express
app.use(express.static(..));
// middleware
stack.use(function(data, next) {
next();
});
Уровень в стеке промежуточного программного обеспечения - это функция, которая принимает n параметров (2 для экспресс-функции, req
& res
) и next
функцию.
Промежуточное программное обеспечение ожидает, что слой выполнит некоторые вычисления, увеличит параметры и затем вызовет next
.
Стек ничего не делает, если вы не справитесь с этим. Express будет обрабатывать стек каждый раз, когда входящий HTTP-запрос перехватывается на сервере. С промежуточным ПО вы обрабатываете стек вручную.
// express, you need to do nothing
// middleware
stack.handle(someData);
Более полный пример:
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
})
В экспресс-выражениях вы просто определяете стек операций, которые вы хотите, чтобы экспресс обрабатывал для каждого входящего HTTP-запроса.
С точки зрения экспресса (а не соединения) у вас есть глобальное промежуточное ПО и промежуточное ПО для конкретных маршрутов. Это означает, что вы можете присоединить стек промежуточного программного обеспечения к каждому входящему HTTP-запросу или только к HTTP-запросам, которые взаимодействуют с определенным маршрутом.
Расширенные примеры экспресс и промежуточного программного обеспечения:
// 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);
});