我看到的几乎每个 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 个参数(2 表示 express,req& 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 请求定义一个您希望 express 处理的操作堆栈。
就快递(而不是连接)而言,您拥有全局中间件和特定于路由的中间件。这意味着您可以将中间件堆栈附加到每个传入的 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); });