我正在阅读 Express.js API reference 中的两个示例但我不明白。
示例 1
Now suppose you wanted to ignore logging requests for static files, but continue logging routes and middleware defined after logger(). You could simply move static() above it:
app.use(express.static(__dirname + '/public'));
app.use(logger());
// other middleware
这如何导致不记录对静态文件的请求? 所有 中间件不是为每个请求执行(按顺序)吗?
例子2
Another concrete example would be serving files from multiple directories, giving precedence to "./public" over the others:
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”是否存在。如果是,则此中间件处理请求并且不执行任何后续中间件(有点像提前返回)。但是,如果此路径不存在,则此中间件会将请求传递给行中的下一个中间件。这是正确的吗?
请解释这两个例子!
最佳答案
Express 路由只是中间件的集合。对服务器的每个请求都沿着中间件链传递。
中间件函数具有签名
function(req, res, next) { }
如上所示,您可以使用 app.use()
将中间件添加到链中。
每个中间件都有两个选择。可以
- 将请求传递到链中的下一个中间件,或者
- 结束请求链并发送响应
如果中间件无法执行其中任何一个,您将看到您的请求超时并且只会无休止地“旋转”。
要传递一个请求,中间件必须调用next()
。传递给中间件的第三个参数是这个 next()
函数。它可能会产生副作用,例如上面的记录器中间件。
要结束一个请求,中间件可以使用附加到res
对象的几种方法之一,比如res.send()
或 res.end()
将响应发送回请求者。所以 express.static
中间件的行为是,如果找到请求的文件,它就会结束请求链并发送文件。如果找不到请求的文件,它会将请求传递到下一个中间件。
关于javascript - 了解 Express.js 中间件优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25577252/