NodeJS app.all('*')与app.use(function)的区别?

7vux5j2d  于 2023-08-04  发布在  Node.js
关注(0)|答案(1)|浏览(136)
app.all('*', function(req, res, next) {

字符串
vs

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


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

o2gm4chl

o2gm4chl1#

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

app.all('*', fn)app.use(fn)

1.执行顺序无差异。

  1. app.use()不考虑方法而触发,app.all()只针对解析器支持的方法(可能不相关,因为node.js http解析器支持所有预期的方法)。

app.all('/test', fn)app.use('/test', fn)

1.执行顺序无差异

  1. app.use()不考虑方法而触发,app.all()只针对解析器支持的方法(可能不相关,因为node.js http解析器支持所有预期的方法)。
  2. app.use()会触发所有以/test开头的路径,包括/test/1//test/otherpath/more/1app.all()仅在与请求的URL完全匹配时才会触发。

详情

所有与给定路由匹配的路由处理程序或中间件都将按照定义的顺序执行,因此app.all('*', fn)app.use(fn)在代码中放置在相同位置时不会有任何不同的顺序。
在查看app.all()的Express代码时,它的工作方式似乎是,它只是遍历本地安装的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)

相关问题