Express.js 中的中间件(Middleware)概念及使用方法

什么是中间件?

在 Express.js 中,中间件(Middleware)指的是处理 HTTP 请求的函数。这些函数可以访问请求对象(req)、响应对象(res)和 web 应用程序中处理请求的下一个中间件函数。中间件负责完成的工作可能是:执行任何代码、对请求和响应对象进行更改、结束请求响应周期、调用下一个中间件或路由等。

Express.js 的请求处理过程通过使用中间件实现。中间件可以是应用程序级别的(app.use()、app.get() 等方法),也可以是路由器级别的(router.use()、router.get() 等方法)。这意味着您可以在整个应用程序或特定路由的请求处理过程中使用中间件。

中间件的使用

下面将介绍使用中间件时的一些重要概念和用法。

使用中间件

使用中间件时需要调用 use() 方法。 use() 方法可以按以下方式传递一个或多个中间件函数:

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

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

中间件函数调用时传递 reqresnext 三个参数。req 表示请求对象,包含 HTTP 请求的所有信息。res 表示响应对象,可以将 HTTP 响应发送回客户端。next() 是可选的参数,有了它,执行流程会继续到下一个相匹配的中间件函数。如果没有 next 参数,则 HTTP 响应将在当前中间件函数结束时结束。

中间件在处理过程中可以在请求和响应对象上进行操作,例如设置/读取/删除请求和响应头,读取请求体等。

中间件的排序

在使用多个中间件时,它们的执行顺序非常重要。在 Express.js 中,执行流程会从上到下依次执行中间件函数。如果某个中间件中不调用 next() 方法,则不会调用下一个匹配的中间件函数,请求处理周期也将在此处结束。

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

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

在上面的示例中,res.send() 方法的执行会结束请求响应周期。因此,中间件函数 2 不会被执行。

错误处理中间件

当向客户端发生错误时,您可以使用错误处理中间件处理错误。错误处理中间件的定义必须使用四个参数,例如:

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

这个中间件会捕获在请求处理周期中产生的异常。如果您使用 next(err) 抛出异常,则此中间件将被调用。

路由器级别的中间件

路由器级别的中间件,是指只能被特定路由器对象的请求处理周期中使用的中间件。在使用路由器时,您可以按以下方式使用它。

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

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

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

app.use() 和 app.METHOD()

app.use() 方法和 app.METHOD() 方法是许多 Express.js 应用程序级别的中间件的传统方法。这些例子可能对于初学者来说有点棘手。但是,如果您理解了在 Express.js 中使用中间件的基本概念,这些方法也会随之变得很容易。

在 Express.js 中,每个 HTTP 请求类型都有一个对应的方法。其中最常用的是 getpostputdelete。Express.js 应用程序可以使用这些方法创建针对不同 HTTP 请求类型的路由。例如:

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

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

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

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

app.use() 方法可以被用于所有 HTTP 请求类型。例如:

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

此外,如果您不想对 request method 进行判断,而是希望从客户端接收任何类型的请求或向客户端发送响应,则可以将一个中间件绑定到 app.all() 方法。例如:

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

结论

中间件是 Express.js 框架非常重要的一个概念,它可以使我们在处理请求过程中完成一些通用的、重复的任务,例如身份验证,安全性检查,请求日志等。在本文中,我们介绍了中间件的概念和使用方法,包括使用中间件,中间件排序,错误处理中间件,路由器级别的中间件和 Express.js 应用程序级别的中间件的传统方法。希望这篇文章对了解 Express.js 中间件的使用和指导有所帮助。

参考链接

  • Express官方文档: Middleware
  • 《深入浅出 Node.js》- 中文版

示例代码

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

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

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


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

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

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

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

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

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

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

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/67287a542e7021665e205e94