中间件
我在一个新项目中将中间件的概念分离了一半。
中间件使您可以定义应执行的操作堆栈。Express服务器本身就是一堆中间件。
// expressvar app = express();// middlewarevar stack = middleware();
然后您可以通过调用将层添加到中间件堆栈
.use
// expressapp.use(express.static(..));// middlewarestack.use(function(data, next) { next();});中间件堆栈中的一层是一个函数,该函数采用n个参数(express为
req&表示2个
res)和一个
next函数。
中间件希望该层进行一些计算,增加参数,然后调用
next。
除非您处理堆栈,否则堆栈不会执行任何操作。每当服务器上捕获到传入的HTTP请求时,Express都会处理堆栈。使用中间件,您可以手动处理堆栈。
// express, you need to do nothing// middlewarestack.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请求。
快递和中间件的高级示例:
// middlewarevar 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); });// expressvar 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); });


