了解Express.js中间件的优先级

我正在阅读Express.js API参考中的两个示例,但我没有得到它们。

实例1

现在假设你想忽略对静态文件的logging请求,但是继续logginglogger()之后定义的路由和中间件。 你可以简单地移动它上面的static():

app.use(express.static(__dirname + '/public'));
app.use(logger());
// other middleware

这是如何导致对静态文件的请求不被logging的? 是不是所有的中间件都是按照顺序执行的?

实例2

另一个具体例子是从多个目录提供文件,优先于“./public”而不是其他文件:

app.use(express.static(__dirname + '/public'));
app.use(express.static(__dirname + '/files'));
app.use(express.static(__dirname + '/uploads'));

我怀疑,例如“/js/stuff.js”这样的请求,第一个中间件会检查“/public/js/stuff.js”是否存在。 如果是这样的话,这个中间件就处理这个请求,而后续的中间件都不会被执行 (类似于早期的返回)。 如果这条path不存在,则这个中间件将请求传递给下一个中间件。 它是否正确?

请解释两个例子!

快车路线只是中间件的集合。 每个对服务器的请求都通过中间件链传递。

中间件function有签名

 function(req, res, next) { } 

您可以使用app.use()向链中添加中间件,如上所见。

每个中间件有两个select。 它可以

  • 将请求传递给链中的下一个中间件,或者
  • 结束请求链并发送响应

如果一个中间件无法做到这一点,你会看到你的请求超时,只是无休止地“旋转”。

传递请求,中间件必须调用next() 。 传递给中间件的第三个参数是next()函数。 它可能有一个副作用,就像上面的logging器中间件一样。

为了结束请求,中间件可以使用附加到res对象的几个方法中的一个,例如res.send()res.end()向请求者发回响应。 所以express.static中间件有这样的行为,如果find了请求的文件,它会结束请求链并发送文件。 如果找不到请求的文件,则将请求传递给下一个中间件。