phần mềm trung gian
Tôi đang phân nửa khái niệm phần mềm trung gian trong một dự án mới.
Middleware cho phép bạn xác định một chồng các hành động mà bạn nên thực hiện. Bản thân các máy chủ Express là một chồng các phần mềm trung gian.
// express
var app = express();
// middleware
var stack = middleware();
Sau đó, bạn có thể thêm các lớp vào ngăn xếp phần mềm trung gian bằng cách gọi .use
// express
app.use(express.static(..));
// middleware
stack.use(function(data, next) {
next();
});
Một lớp trong ngăn xếp phần mềm trung gian là một hàm, có n tham số (2 cho express, req
& res
) và một next
hàm.
Middleware hy vọng lớp sẽ thực hiện một số tính toán, tăng các tham số và sau đó gọi next
.
Một ngăn xếp không làm gì cả trừ khi bạn xử lý nó. Express sẽ xử lý ngăn xếp mỗi khi yêu cầu HTTP đến được bắt gặp trên máy chủ. Với phần mềm trung gian, bạn xử lý ngăn xếp bằng tay.
// express, you need to do nothing
// middleware
stack.handle(someData);
Một ví dụ đầy đủ hơn:
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
})
Theo thuật ngữ rõ ràng, bạn chỉ cần xác định một chồng các hoạt động mà bạn muốn express xử lý cho mọi yêu cầu HTTP đến.
Về mặt thể hiện (chứ không phải kết nối), bạn có phần mềm trung gian toàn cầu và định tuyến phần mềm trung gian cụ thể. Điều này có nghĩa là bạn có thể đính kèm một ngăn xếp phần mềm trung gian cho mọi yêu cầu HTTP đến hoặc chỉ đính kèm nó với các yêu cầu HTTP tương tác với một tuyến đường nhất định.
Các ví dụ nâng cao về express & 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);
});