每次在server.js上听到路径时都会执行express app.use
这取决于您是否在任何app.use()
语句中使用路径,这取决于所有app.use()
语句是否将控制权传递给下一个处理程序,或者是否其中一些语句故意终止链并自行处理最终响应.
所有app.use()
语句都被注册为中间件处理程序,用于命中该app
对象的所有请求.如果它上面有一个特定的路径,那么只有在匹配该路径时才会调用它.如果它没有路径(如在您的示例中),则将考虑每个请求.
当调用给定的中间件处理程序时,它将从Express文档中传递三个参数,如本示例所示:
app.use(function (req, res, next) { console.log('Time: %d', Date.now()); next(); });
注意,最后一个参数next
.当一个中间件函数被调用时,它有三个主要的选择:它是如何工作的:
它可以做一些事情,然后让请求继续给其他处理程序.
它可以执行某些操作然后触发错误(例如,身份验证失败或缺少必需的会话cookie).
它可以做一些事情,然后发送最终的响应(res.send(xxxx)
),而不是将控制传递给其他处理程序.
将控制权传递给其他处理程序的机制是在完成处理后调用next()
,并准备好让其他处理程序在此请求时获得破解.如果每个中间件处理程序调用next()
它们看到的每个请求,那么将为每个请求调用所有app.use()
处理程序.在上面的Express文档示例中,您可以看到这是一个非常简单的中间件处理程序.它只是记录请求的时间,然后调用next()
将控制权传递给链中的下一个处理程序.
如果其中一个中间件处理程序没有调用next()
,那么对于该请求,链中的所有处理程序都不会被调用该请求.
另外,您可以将中间件限制为仅限于某些URL路径.而不是打电话
app.use(example1)
您可以将路径包含为参数,例如:
app.use('/api', example1);
然后,只会为以中开头的路径调用此中间件/api
.
或者,您可以类似地使用路由器来创建中间件分支.例如,如果您有一些中间件处理程序,您只想为以开头的请求调用/api
,那么您可以为/api
URL上的前缀创建路由器,并将中间件处理程序附加到该路由器而不是应用程序对象,然后该路由器上的中间件处理程序仅/api
针对以该路由器开头并因此指向该路由器的请求进行调用.
// create api router var router = express.Router(); // register middleware that is called only when requests go through this router router.use(example1); // register normal get handler router.get('/whatever', function(req, res) {...}); // hook api router into the app app.use('/api', router);