我看到的几乎每个Express应用程序都有一个app.use关于中间件的声明,但是我没有找到关于中间件实际上是什么以及该app.use声明在做什么的清晰,简洁的解释。甚至快递文档本身对此也含糊不清。你能帮我解释一下这些概念吗?
app.use
中间件
我在一个新项目中将中间件的概念分离了一半。
中间件使您可以定义应执行的操作堆栈。Express服务器本身就是一堆中间件。
// express var app = express(); // middleware var stack = middleware();
然后您可以通过调用将层添加到中间件堆栈 .use
.use
// express app.use(express.static(..)); // middleware stack.use(function(data, next) { next(); });
中间件堆栈中的一层是一个函数,该函数采用n个参数(express为req&表示2个res)和一个next函数。
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 })
用快速术语来说,您只需定义要快速处理的每个传入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); });