【问题标题】:Understanding Express.js middleware precedence了解 Express.js 中间件优先级
【发布时间】:2014-10-23 23:53:13
【问题描述】:

我正在阅读Express.js API reference 中的两个示例,但我不明白。

示例 1

现在假设您想忽略对静态文件的日志记录请求,但继续记录在 logger() 之后定义的路由和中间件。你可以简单地将 static() 移到它上面:

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

这如何导致不记录对静态文件的请求? 所有中间件不是为每个请求执行(按顺序)吗?

示例 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”是否存在。如果是这样,这个中间件会处理请求并且后续的中间件都不会被执行(有点像提前返回)。但是,如果此路径不存在,则此中间件将请求传递给行中的下一个中间件。这是正确的吗?

请解释这两个例子!

【问题讨论】:

    标签: javascript node.js http express httprequest


    【解决方案1】:

    Express 路由只是中间件的集合。对服务器的每个请求都沿中间件链传递。

    中间件函数具有签名

    function(req, res, next) { }
    

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

    每个中间件都有两种选择。可以

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

    如果中间件未能执行其中任何一项,您将看到您的请求超时并且无休止地“旋转”。

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

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

    【讨论】:

    • 我明白了。关键是有些中间件总是调用next()(比如日志、cookie解析等),而有些中间件只有在处理请求失败时才调用next()。我认为应该在文档中更好地解释这种区别。
    猜你喜欢
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 2019-05-21
    • 2011-05-03
    相关资源
    最近更新 更多