我看到的几乎每个 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
})
在明确的术语中,您只需为每个传入的 HTTP 请求定义一个您希望 express 处理的操作堆栈。
就 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);
});
关于node.js - 中间件和 app.use 在 Expressjs 中的实际含义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7337572/