我看到的几乎每个Express应用程序都有一个app.use
关于中间件的声明,但是我没有找到关于中间件实际上是什么以及该app.use
声明在做什么的清晰,简洁的解释。甚至快递文档本身对此也含糊不清。你能帮我解释一下这些概念吗?
中间件
我在一个新项目中将中间件的概念分离了一半。
中间件使您可以定义应执行的操作堆栈。Express服务器本身就是一堆中间件。
// express
var app = express();
// middleware
var stack = middleware();
然后您可以通过调用将层添加到中间件堆栈 .use
// express
app.use(express.static(..));
// middleware
stack.use(function(data, next) {
next();
});
中间件堆栈中的一层是一个函数,该函数采用n个参数(express为req
&表示2个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);
});
为了正确理解Java中并发性的问题和解决方案,我浏览了官方的Java教程。在其中一页中,他们定义了内部锁和同步链接。在这一页,他们说: 只要一个线程拥有一个内在锁,其他线程就不能获得相同的锁。另一个线程在试图获取锁时会阻塞。 此外,他们在同步方法中的锁一节中提到: 当线程调用同步方法时,它会自动获取该方法对象的内部锁,并在方法返回时释放该锁。即使返回是由未捕获的异常引起的,也会发生锁释放。 对我来
问题内容: 我有这个时间戳值由Web服务返回 我知道这意味着时区,但是那到底是什么意思呢? 而且我正在尝试模拟此Web服务,因此有没有办法在python中使用生成此时间戳的方法? 很抱歉,如果这很明显,但Google的帮助不是很大,参考页面也没有。 我目前正在使用这个: 问题答案: 在并没有真正纳入什么。这仅仅是 分隔 的ISO 8601相结合的日期时间格式 要求。您可以将其阅读为 Time 的缩
问题内容: 下面是代码片段。 有人可以向我解释@符号在Java中的含义吗? 问题答案: 这是一个注释。 注释是元数据的一种形式。它们提供的程序数据不属于程序本身。注释对其注释的代码的操作没有直接影响。 注释确实会影响工具和库对待程序的方式,进而会影响正在运行的程序的语义。可以从源文件,类文件中读取注释,也可以在运行时从中读取注释。
问题内容: 异步在Ajax中意味着什么?以及Ajax如何知道何时在不进行服务器轮询的情况下提取数据? 问题答案: 异步意味着脚本将向服务器发送请求,并继续执行它而无需等待答复。收到答复后,立即触发浏览器事件,该事件进而允许脚本执行关联的操作。 Ajax知道何时从服务器提取数据,因为您告诉它何时进行处理。
我想创建一个
问题内容: 我对gulp比较陌生,我想知道gulp任务到底是做什么的?我已经搜集到它通常在a 和after之后运行,但是它还必须更多。我一直无法在网上或gulp的文档中找到任何东西,我真的很想了解我在使用什么。 编辑我发现了这个,但是在解释它方面做得很差 问题答案: 从Node文档中: https://nodejs.org/api/stream.html#stream_visible_pipe_d