middleware
Saya setengah jalan memisahkan konsep middleware dalam proyek baru.
Middleware memungkinkan Anda untuk menentukan setumpuk tindakan yang harus Anda lalui. Express server sendiri adalah setumpuk middlewares.
// express
var app = express();
// middleware
var stack = middleware();
Kemudian Anda bisa menambahkan lapisan ke tumpukan middleware dengan memanggil .use
// express
app.use(express.static(..));
// middleware
stack.use(function(data, next) {
next();
});
Lapisan dalam tumpukan middleware adalah fungsi, yang mengambil n parameter (2 untuk express, req
& res
) dan sebuah next
fungsi.
Middleware mengharapkan layer untuk melakukan beberapa perhitungan, menambah parameter dan kemudian memanggil next
.
Tumpukan tidak melakukan apa pun kecuali Anda menanganinya. Express akan menangani tumpukan setiap kali permintaan HTTP masuk ditangkap di server. Dengan middleware Anda menangani tumpukan secara manual.
// express, you need to do nothing
// middleware
stack.handle(someData);
Contoh yang lebih lengkap:
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
})
Dalam istilah ekspres, Anda cukup menentukan setumpuk operasi yang ingin Anda ekspresikan untuk setiap permintaan HTTP yang masuk.
Dalam hal mengekspresikan (daripada menghubungkan), Anda memiliki middleware global dan rute middleware khusus. Ini berarti Anda dapat melampirkan tumpukan middleware ke setiap permintaan HTTP yang masuk atau hanya melampirkannya ke permintaan HTTP yang berinteraksi dengan rute tertentu.
Contoh lanjutan dari ekspres & 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);
});