app.all(' *')VS app.use(功能)之间的区别?

时间:2017-11-24 21:46:59

标签: node.js express routes

app.all('*', function(req, res, next) { 

VS

app.use(function (req, res, next) {

区别是什么?不会将每个请求都接收到服务器吗?

1 个答案:

答案 0 :(得分:2)

对于通配符*路径,根本没有太大的意义差异。在我看来,内部实施可能会稍微提高app.use(fn),然后app.all('*', fn)。并且,如果您打算在所有路线上运行,那么app.use()对我来说更具逻辑意义,因为您真正在做的是中间件,而app.use()是特别的专为。而设计。

app.all('*', fn)app.use(fn)的摘要:

  1. 执行顺序没有区别。
  2. 无论方法如何,
  3. app.use()都会触发,app.all()仅触发解析器支持的方法(可能不相关,因为node.js http解析器支持所有预期的方法)。
  4. app.all('/test', fn)app.use('/test', fn)的摘要:

    1. 执行顺序无差异
    2. 无论方法如何,
    3. app.use()都会触发,app.all()仅触发解析器支持的方法(可能不相关,因为node.js http解析器支持所有预期的方法)。
    4. 对于以app.use()开头的所有路径,
    5. /test会触发/test/1//test/otherpath/more/1app.all()仅在与请求的url.x
    6. 完全匹配时才会触发

      <强>详情

      匹配给定路由的所有路由处理程序或中间件都按照它们的定义顺序执行,因此app.all('*', fn)app.use(fn)在放置在代码中的相同位置时没有任何不同的顺序。

      在查看Express code for app.all()时,它的工作方式似乎是它只是通过本地安装的HTTP解析器支持的所有HTTP方法并为它们注册处理程序。所以,例如,如果你这样做:

      app.all('*', fn);
      

      Express代码将运行这些:

      app.get('*', fn);
      app.put('*', fn);
      app.post('*', fn);
      app.delete('*', fn);
      // ...etc...
      

      app.use()与方法无关。无论方法是什么,app路由器堆栈中只有一个处理程序被调用。因此,即使发出了不受支持的http谓词并且解析器让请求得到了这么远,app.use()处理程序仍将适用,而app.all()处理程序则不会。

      如果您使用的app.all()app.use()路径不仅仅是'*'这样的简单通配符,那么两者之间就会有一个有意义的差异。

      app.all(path, fn)仅在请求的路径与此处的路径完全匹配时触发。

      当请求的路径的开头与此处的路径匹配时,

      app.use(path, fn)会触发。

      所以,如果你有:

      app.all('/test', fn1);     // route 1
      app.use('/test', fn2);     // route 2
      

      并且,您发出请求:

      http://yourhost.com/test         // both route1 and route2 will match
      http://yourhost.com/test/1       // only route2 will match
      

      因为只有app.use()的中间件触发部分匹配,其中请求的URL包含的路径段超出此处指定的路径段。

      因此,如果您打算插入一些针对所有路由运行的中间件,或者针对从某个路径下载的所有路由运行,则使用app.use()。就个人而言,我只会使用app.all(path, fn),如果我想要一个处理程序只运行一个特定的路径,无论方法是什么,我也不希望它也运行包含此路径的路径开始。我认为没有任何实际理由可以app.all('*', fn)使用app.use(fn)