到目前为止,我发现了 3 个主要差异。第三个不是那么明显,你可能会觉得它很有趣。快递router 的区别是相同的。这意味着router.use()和router.get()或其他post、put、all等方法也有相同的区别。
1
-
app.use(path, callback) 将响应任何 HTTP 请求。
-
app.get(path, callback) 只会响应 GET HTTP 请求。同理,post、put 等也会响应其对应的请求。 app.all() 响应任何 HTTP 请求,因此 app.use() 和 app.all() 在这部分是相同的。
2
-
app.use(path, callback) 将匹配请求路径的前缀,如果请求路径的任何前缀匹配路径参数,则响应。如路径参数为"/",则匹配"/"、"/about"、"/users/123"等。
-
app.get(path, callback) 这里的 get 将匹配整个路径。其他 HTTP 请求和app.all() 相同。如路径参数为"/",则只匹配"/"。
3
next('route') 不作用于app.use() 的中间件/回调函数。它仅适用于app.get()、app.all()和其他HTTP请求的其他类似功能。
根据express文档:
next('route') 仅适用于使用 app.METHOD() 或 router.METHOD() 函数加载的中间件函数。
METHOD 是中间件函数请求的 HTTP 方法
小写的句柄(例如 GET、PUT 或 POST)。
从这里我们将使用关键字 METHOD 代替 get、post、all 等。
但是next('route')是什么?!
让我们看看。
下一个('路线')
我们看到,app.use() 或 app.METHOD() 可以采用多个回调/中间件函数。
来自 express 文档:
中间件函数是可以访问请求对象 (req)、响应对象 (res) 和应用程序请求-响应周期中的下一个中间件函数的函数。 next 中间件函数通常由名为 next 的变量表示。
如果当前中间件函数没有结束请求-响应循环,它必须调用 next() 将控制权传递给下一个中间件函数。否则,请求将被挂起。
所以我们看到每个中间件函数要么调用下一个中间件函数要么结束响应。
app.use() 和 app.METHOD() 也是如此。
但有时在某些情况下,您可能希望跳过当前路由的所有下一个回调函数,但也不想立即结束响应。因为也许还有其他路线应该匹配。所以要跳过当前路由的所有回调函数而不结束响应,可以运行next('route')。它将跳过当前路由的所有回调函数并搜索匹配下一个路由。
例如(来自快速文档):
app.get('/user/:id', function (req, res, next) {
// if the user ID is 0, skip to the next route
if (req.params.id === '0') next('route')
// otherwise pass the control to the next middleware function in this stack
else next()
}, function (req, res, next) {
// send a regular response
res.send('regular')
})
// handler for the /user/:id path, which sends a special response
app.get('/user/:id', function (req, res, next) {
res.send('special')
})
看,这里在特定条件(req.params.id === '0') 我们想跳过下一个回调函数但又不想结束响应,因为有另一个相同路径参数的路由将被匹配并且该路由将发送一个特殊的回应。 (是的,对同一个METHOD多次使用相同的路径参数是有效的。在这种情况下,所有的路由都会匹配到响应结束)。所以在这种情况下,我们运行next('route') 并跳过当前路由的所有回调函数。这里如果条件不满足则调用下一个回调函数。
这种next('route') 行为只能在app.METHOD() 函数中实现。
从快速文档中回顾:
next('route') 仅适用于使用 app.METHOD() 或 router.METHOD() 函数加载的中间件函数。
由于在app.use() 中不可能跳过当前路由的所有回调函数,所以我们在这里应该小心。我们应该只使用app.use() 中的中间件函数,在任何情况下都不需要跳过。因为要么要结束响应,要么要从头到尾遍历所有回调函数,根本不能跳过。
您可以访问here了解更多信息