几乎我看到的每个Express应用程序都有一个关于中间件的app.use
条语句,但我还没有找到一个关于中间件到底是什么以及app.use
条语句在做什么的清晰、简洁的解释.就连express 文件本身也有点含糊其辞.你能给我解释一下这些概念吗?
几乎我看到的每个Express应用程序都有一个关于中间件的app.use
条语句,但我还没有找到一个关于中间件到底是什么以及app.use
条语句在做什么的清晰、简洁的解释.就连express 文件本身也有点含糊其辞.你能给我解释一下这些概念吗?
在一个新的项目中,我正在将中间件的概念分离一半.
中间件允许您定义一系列应该执行的操作.Express服务器本身就是一堆中间软件.
// 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
.
除非你处理它,否则堆栈什么都做不了.每次服务器上捕获到传入的HTTP请求时,Express都会处理堆栈.使用中间件,您可以手动处理堆栈.
// 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
})
在express中,您只需定义一个操作堆栈,希望express for each 传入的HTTP请求处理这些操作.
在express(而不是connect)方面,您有全局中间件和路由特定中间件.这意味着您可以将中间件堆栈附加到每个传入的HTTP请求,或者仅将其附加到与特定路由交互的HTTP请求.
express&;中间件:
// 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);
});