проміжне програмне забезпечення
Я на півдорозі розділяю концепцію проміжного програмного забезпечення в новому проекті.
Посереднє програмне забезпечення дозволяє визначити степ дій, які ви повинні пройти через. Самі експрес-сервери - це стек середнього рівня.
// express
var app = express();
// middleware
var stack = middleware();
Потім ви можете додати шари в стек середнього програмного забезпечення, зателефонувавши .use
// express
app.use(express.static(..));
// middleware
stack.use(function(data, next) {
next();
});
Шар у стеці проміжного програмного забезпечення - це функція, яка приймає n параметрів (2 для express, 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);
});