javascript - 了解 Express.js 中间件优先级

标签 javascript node.js http express httprequest

我正在阅读 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/

相关文章:

node.js - 使用 Node.js 在服务器上执行脚本并在客户端上显示脚本输出的最佳方法是什么?

java - 使用 json 发出 HTTP post 请求

http - HTTP HEAD 方法的可靠性

rest - API响应部分失败并要求客户端重试的行业实践

javascript - 如何从 ExtJs 4 中的按钮处理程序访问数字字段值?

javascript - 是否有 lodash 函数或 'lodash way' 来执行条件 _.map?

node.js - 尝试在远程计算机上运行 "npm install"时飞行计划脚本失败

javascript - NodeJS计划支持导入/导出es6(es2015)模块

javascript - 分割字符串后获取单词

javascript - 对于移动应用程序,Kendo Ui Core 中应该存在哪些文件?