ara katman
Yeni bir projede ara katman kavramını ayırarak yarı yoldayım.
Ara katman yazılımı, içinden geçmeniz gereken bir eylem yığını tanımlamanızı sağlar. Ekspres sunucuların kendisi bir orta yol yığınıdır.
// express
var app = express();
// middleware
var stack = middleware();
Daha sonra arayarak ara katman yığınına katmanlar ekleyebilirsiniz. .use
// express
app.use(express.static(..));
// middleware
stack.use(function(data, next) {
next();
});
Orta katman yığınındaki bir katman, n parametresini (ekspres için 2, req& res) alan bir nextişlev ve bir işlevdir.
Middleware, katmanın bir miktar hesaplama yapmasını, parametreleri artırmasını ve ardından çağırmasını bekler next.
Bir yığın, siz işlemediğiniz sürece hiçbir şey yapmaz. Express, sunucuya her gelen HTTP isteği yakalandığında yığını işleyecektir. Ara katman yazılımı ile yığını elle yönetirsiniz.
// express, you need to do nothing
// middleware
stack.handle(someData);
Daha eksiksiz bir örnek:
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
})
Ekspres terimlerle, gelen her HTTP isteği için ekspresin işlemesini istediğiniz bir işlem yığını tanımlarsınız.
Ekspres açısından (bağlanmak yerine) global bir ara katman yazılımına ve yola özgü ara katman yazılımına sahipsiniz. Bu, gelen her HTTP isteğine bir ara katman yığını ekleyebileceğiniz veya yalnızca belirli bir yolla etkileşime giren HTTP isteklerine ekleyebileceğiniz anlamına gelir.
Express & Middleware'in gelişmiş örnekleri:
// 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);
});