在 Express.js 应用程序中,中间件(middleware)是处理请求、响应周期的功能组件。Express.js 提供了一种方便的机制,可以将这些功能组件安排在一条链中,这时我们可以构建出一个中间件链来执行特定的操作。本文将介绍Express.js中间件链和执行顺序的详细解析,并提供示例代码以供学习和实践。
中间件的基本概念
在 Express.js 中,中间件是一种函数,它可以访问请求对象(request object-req)、响应对象(response object-res)和应用程序中处理链中的下一个中间件函数。在一个中间件函数完成其任务之前,它可以执行任何操作,并修改请求和响应对象,包括添加、删除、更改其属性等。
中间件函数可以执行这些任务来:
- 执行任何代码。
- 更改请求和响应对象。
- 终止请求/响应循环。
- 调用堆栈中的下一个中间件函数。
在中间件链中,每个中间件都可以执行任何操作,然后调用堆栈中的下一个中间件以向客户端发送响应。所以,多个中间件形成一个中间件链,其处理请求、响应周期的顺序和程序中定义的顺序一致。
中间件链的构建和执行顺序
在 Express.js 应用程序中,中间件链是按照定义的顺序执行的。可以使用 app.use() 和 app.METHOD() 方法将中间件组件添加到 Express.js 应用程序中。其中,app.use() 方法用于在指定路由或路径中运行中间件,而 app.METHOD() 方法(其中 METHOD 是 HTTP 方法,如 GET、PUT、POST 和 DELETE)用于将中间件绑定到指定 HTTP 方法上。
以下是将两个中间件函数添加到 Express.js 应用程序的示例代码:
-- -------------------- ---- ------- ----- ------- - ------------------ ----- --- - --------- -- ------ ------------- ---- ----- -- - --------------------- ------ -- -- ------ ------------- ---- ----- -- - --------------------- ------ -- -- ------ ------------ ----- ---- -- - ------------------ --
在这个例子中,我们添加了两个中间件函数。在第一个中间件中,我们只是简单地记录一条消息,然后将请求变量传递给下一个中间件函数。同样,第二个中间件也只是记录一条消息,然后将请求传递给路由处理程序。
执行以上代码并访问应用程序的根路径会输出以下结果:
第一个中间件 第二个中间件
从结果来看,我们可以看到第一个中间件先执行,然后是第二个中间件,最后是路由处理程序。即中间件的执行顺序符合程序中定义的顺序。
中间件链的控制流程
在 Express.js 应用程序中,中间件链的控制流程通常由 next() 方法的调用组成。next() 方法可以将控制传递给堆栈中下一个中间件函数。如果当前中间件函数没有调用 next() 将控制传递给下一个中间件,则堆栈的其余部分将不会被执行,并返回假定的响应。
-- -------------------- ---- ------- ----- ------- - ------------------- ----- --- - ---------- -- ------ ------------- ---- ----- -- - ------------------------ ------- --- -- ------ ------------- ---- ----- -- - ------------------------ --------------------- --- -- ------ ------------ ----- ---- -- - ---------------------- --------------------- ---
在这个例子中,第二个中间件函数不调用 next(),而是直接发送响应给客户端。因此,当应用程序处理根路径请求时,会输出以下内容:
第一个中间件开始 第二个中间件开始
即中间件链在第二个函数处终止,没有执行路由处理程序。
中间件链的错误控制流程
在 Express.js 应用程序中,如果出现错误,则必须使用错误处理中间件(error handling middleware)将错误传递到应用程序中,这样才能将错误发送给客户端。错误处理中间件必须用 err 作为第一个参数,并通过调用 next(err) 将控制流量传递到下一个错误处理中间件。
-- -------------------- ---- ------- ----- ------- - ------------------- ----- --- - ---------- -- ------ ------------- ---- ----- -- - ------------------------ -------- --------------- --- -- ------ ------------- ---- ----- -- - ------------------------ --------------------- --- -- ------- ------------- ---- ---- ----- -- - ----------------------- ----- ------------------------------ --- -- ------ ------------ ----- ---- -- - ---------------------- --------------------- ---
在这个例子中,第一个中间件函数故意抛出一个错误。因此,当应用程序处理根路径请求时,会输出以下内容:
第一个中间件开始 错误处理中间件: Error:发生错误
即错误处理中间件接收到的错误对象是通过 next(err) 方法传递到的。一旦错误处理中间件被调用,没有其他中间件或路由处理程序将被执行。
小结
在本文中,我们介绍了中间件的基本概念、构建和执行顺序,并提供了一些示例代码。同时,我们还学习了中间件链的控制流和错误控制流程。希望本文对您在实践Express.js时有所帮助,也希望您在实践中充分发挥中间件的优势,构建出高效的Express.js应用程序。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6782648b935627c90005b1ac