Express.js中间件链和执行顺序的详细解析

阅读时长 5 分钟读完

在 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) 将控制流量传递到下一个错误处理中间件。

-- -------------------- ---- -------
----- ------- - -------------------
----- --- - ----------

-- ------
------------- ---- ----- -- -
  ------------------------
  -------- ---------------
---

-- ------
------------- ---- ----- -- -
  ------------------------
  ---------------------
---

-- -------
------------- ---- ---- ----- -- -
  ----------------------- -----
  ------------------------------
---

-- ------
------------ ----- ---- -- -
  ----------------------
  ---------------------
---

在这个例子中,第一个中间件函数故意抛出一个错误。因此,当应用程序处理根路径请求时,会输出以下内容:

即错误处理中间件接收到的错误对象是通过 next(err) 方法传递到的。一旦错误处理中间件被调用,没有其他中间件或路由处理程序将被执行。

小结

在本文中,我们介绍了中间件的基本概念、构建和执行顺序,并提供了一些示例代码。同时,我们还学习了中间件链的控制流和错误控制流程。希望本文对您在实践Express.js时有所帮助,也希望您在实践中充分发挥中间件的优势,构建出高效的Express.js应用程序。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6782648b935627c90005b1ac

纠错
反馈

程序员教程

精选优质教程,助你快速提升技术实力

程序员面试题库

海量优质面试题,助你轻松应对技术面试