node.js - app.all ('*' ) 与 app.use(function) 之间的区别?

标签 node.js express routes

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

对比

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

有什么区别吗?两者不都接受对服务器的每个请求吗?

最佳答案

对于通配符 * 路径,实际上没有太大有意义的差异。在我看来,app.use(fn) 的内部实现可能比 app.all('*', fn) 稍微更高效。而且,如果您打算让它在所有路由上运行,那么 app.use() 对我来说更符合逻辑,因为您真正做的是中间件,而这正是 app.use() 专门设计的。

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

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

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

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

详细信息

与给定路由匹配的所有路由处理程序或中间件都按照定义的顺序执行,因此 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() 是方法独立的。无论方法是什么,应用程序路由器的堆栈中都只会调用一个处理程序。因此,即使发出了不受支持的 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)

关于node.js - app.all ('*' ) 与 app.use(function) 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47480386/

相关文章:

javascript - 使嵌套 mongodb 查询更快

php - 如何覆盖 Codeigniter 3 路由以仅显示名称而不是 id 和名称

javascript - 避免回应机器人

javascript - 仅在特定日期和时间运行 cron 作业

node.js - Node-sass 不会在最新的 node/express 中自动编译

node.js - Express 未捕获到 '/' 的请求

asp.net-mvc - 如何将用户重定向到 ASP.NET MVC 中的自定义 404 页面而不是引发异常?

node.js - 无法使用 MEAN 堆栈连接到 Mongodb.atlas 集群

javascript - 将包含文件传递到 Handlebars 布局中

javascript - new Date().toJSON() 在 Javascript 中总是唯一的吗?