了解Express.js中间件优先级

Šim*_*das 1 javascript http httprequest node.js express

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

例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"是否存在.如果是,则此中间件处理请求,并且不会执行任何后续中间件(类似于提前返回).如果此路径不存在,则此中间件将请求传递给下一个中间件.它是否正确?

请解释这两个例子!

Int*_*ang 5

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

中间件功能具有签名

function(req, res, next) { }
Run Code Online (Sandbox Code Playgroud)

app.use()正如您在上面所看到的,您可以使用中间件添加中间件.

每个中间件都有两个选择.它可以

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

如果中间件无法执行其中任何一项操作,您将看到您的请求超时并且无休止地"旋转".

传递请求,中间件必须调用next().传递给中间件的第三个参数是这个next()函数.它可能有副作用,如上面的记录器中间件.

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

  • 我知道了.关键是一些中间件总是调用`next()`(如日志记录,cookie解析等),而其他一些中间件只有在无法处理请求时才会调用`next()`.我认为应该在文档中更好地解释这种区别. (2认同)