在 Express.js 应用程序中使用中间件的正确方式

阅读时长 8 分钟读完

在 Express.js 中,中间件是一种非常有用的机制,可以帮助开发者在请求与响应之间执行代码,并且可以对请求进行处理、转换、验证等操作。正确使用中间件可以提高程序的可读性、可维护性、可测试性,并且还可以有效防止许多攻击。本文将介绍在 Express.js 应用程序中使用中间件的正确方式,内容详细、有深度和学习和指导意义,最后提供了使用示例代码。

概述

Express.js 中的中间件是一组函数,它们可以在请求的生命周期中执行,并且可以访问请求和响应的对象。中间件可以处理请求对象、验证参数、发送响应,并将请求传递给下一个中间件或路由处理程序。Express.js 中的每个中间件都可以执行任何操作,包括修改请求对象、响应对象、添加属性、调用下一个中间件等。

中间件的执行过程在 Express.js 的生命周期中的“执行期”之前,即在请求到达路由处理程序之前或响应发送到客户端之前。中间件函数由app.use()、app.get()、app.post()、app.put()、app.delete()等函数组成,其中app.use()函数是最常用的,因为它可以处理所有类型的HTTP请求。中间件可以是一个函数,也可以是一个函数数组,这样可以同时执行多个函数进行请求处理和响应操作。

使用中间件的技巧

在实际开发中,我们需要正确使用中间件,以下是一些在 Express.js应用程序中使用中间件的技巧:

1. 使用第三方中间件

Express.js 支持大量的第三方中间件,包括处理表单数据、请求日志、验证、压缩、身份验证、CSRF防护等。使用第三方中间件可以节省开发时间,提高代码质量,而不用编写自己的中间件,例如:

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

2. 按顺序使用中间件

Express.js 中间件的执行顺序非常重要,因为每个中间件都可以修改请求和响应对象,例如增加、删除和修改属性等。如果中间件不按照正确的顺序使用,可能会导致不正确的处理结果。

通常,需要在路由处理程序之前添加中间件来处理请求对象,例如:验证API密钥、验证授权信息、转换JSON数据、解析查询字符串等。在此之后,在路由处理程序之前添加中间件处理响应对象,例如:缓存控制、CORS策略、错误处理等。示例代码:

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

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

3. 实用可复用中间件

中间件可以是有用的可复用组件,在多个应用程序中使用的中间件可以被抽象为单独的npm模块。例如,可以使用一种日志中间件来记录日志,以避免在多个应用程序中编写相同的日志代码。示例代码:

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

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

4. 使用Async函数或Promise来启用异步中间件

中间件可以是异步的,例如:执行文件上传,从数据库查询数据等。在可用时,应使用Async/await函数或Promise返回中间件。这样能更清晰地展示请求执行期间的异步操作,如下所示:

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

5. 使用中间件传递数据

为了在中间件之间共享数据,需要使用res.locals对象。res.locals作为中间件之间传递数据的容器,它是一个Javascript对象,可以设置任何属性。在后续的中间件或路由处理程序中调用req.app.locals可以访问应用程序配置信息、中间件参数、共享数据等。示例代码:

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

总结

中间件是Express.js的强大机制,它提供了许多有用和可重用的功能,在请求和响应之间执行代码,可以修改请求对象、响应对象或调用下一个中间件或路由处理程序。在实践中,需要按正确的顺序使用中间件、使用可重用的中间件、使用异步的中间件、使用第三方中间件和共享数据。以上是在Express.js中使用中间件的正确方式,希望读者可以根据文章提供的内容在实际项目中正确地使用中间件。

示例代码

以下是一个示例代码,展示了如何在Express.js中使用各种类型的中间件:

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

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

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

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

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

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

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

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

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

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

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

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

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

纠错
反馈