了解Express.js中间件优先级

时间:2014-08-29 22:51:14

标签: javascript node.js http express httprequest

我正在阅读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"存在。如果是,则此中间件处理请求并且没有后续中间件被执行(类似于提前返回)。如果此路径不存在,则此中间件将请求传递给下一个中间件。这是对的吗?

请解释这两个例子!

1 个答案:

答案 0 :(得分:5)

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

中间件功能具有签名

function(req, res, next) { }

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

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

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

如果中间件无法执行上述任何一项操作,您会看到请求超时并且无休止地“旋转”。

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

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