【发布时间】:2018-05-08 21:19:36
【问题描述】:
app.all('*', function(req, res, next) {
对
app.use(function (req, res, next) {
有什么区别?不是都接受对服务器的每个请求吗?
【问题讨论】:
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) 的总结:
app.use() 无论方法如何都会触发,app.all() 只会触发解析器支持的方法(可能不相关,因为 node.js http 解析器支持所有预期的方法)。app.all('/test', fn) 与 app.use('/test', fn) 的总结:
app.use() 无论方法如何都会触发,app.all() 只会触发解析器支持的方法(可能不相关,因为 node.js http 解析器支持所有预期的方法)。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)。
【讨论】: