Mongoose 中使用中间件的方法及实例

阅读时长 10 分钟读完

在 Mongoose 中,中间件是指在执行某些操作前或后,添加一些自定义的代码来完成一些额外的逻辑处理。Mongoose 中有四种类型的中间件:文档中间件、模式中间件、查询中间件和聚合中间件。

本文将介绍 Mongoose 中使用中间件的方法及实例,包括中间件的注册、使用、分类、实现和调试。其中,我们以使用文档中间件为例,通过详细说明其使用方法以及提供实际开发中会用到的例子,让读者掌握 Mongoose 中间件使用的技巧和经验,从而在实际开发中能够更加高效地使用 Mongoose。

中间件的注册

在 Mongoose 中,中间件的注册有两种方式:全局注册和实例注册。全局注册就是在 Schema 上注册中间件,所有通过这个 Schema 定义的模型都会应用该中间件。而实例注册就是在模型实例上单独注册中间件,只有这个模型实例会应用该中间件。钩子函数的签名可以是以下任意一种:

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

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

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

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

全局注册中间件:

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

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

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

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

在上面的代码最后一行,我们用 mongoose.model 注册了 Person 这个模型,这样在之后我们就可以使用 Person 这个模型了。这个模型上应用了一个 pre-save 的中间件,在保存之前设置了 updatedAt 的时间戳。

实例注册中间件:

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

实际开发中的例子

下面,我们以开发一个博客系统为例,介绍如何在 Mongoose 中使用中间件实现更高效的编程。

  1. 使用文档中间件实现自动添加时间戳

博客系统需要保存文章的创建时间和修改时间。为了方便实现这个功能,我们可以使用文档中间件来自动添加时间戳。

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

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

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

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

在上面的代码中,我们定义了一个 Article 模型,并且在它的 Schema 中使用了文档中间件。在每次保存 Article 实例时,都会先执行 pre('save') 的中间件:将当前时间赋值给 updatedAt

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

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

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

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

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

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

在上面的代码中,我们通过 express 框架搭建了服务器,并且引入了 body-parsermethod-override 等中间件。但在此处没有直接用到“中间件的方法及实例”,故下面再举几个使用中间件的例子。

  1. 使用文档中间件实现文件上传

博客系统需要保存文章的封面图片。为了实现上传图片的功能,我们可以使用文档中间件来保存图片的路径。

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

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

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

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

在上面的代码中,我们修改了 Article 的 Schema ,增加了 coverImage 字段。在每次保存 Article 实例时,都会先执行 pre('save') 的中间件来上传图片,然后将其路径保存到 coverImage 字段中。

  1. 使用查询中间件实现排序

博客系统需要以修改时间倒序排列文章。为了实现这个功能,我们可以使用查询中间件来自动添加排序条件。

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

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

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

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

在上面的代码中,我们修改了 Article 的 Schema ,在 query 上应用 preprocesser 中间件,添加了排序条件。

  1. 使用模式中间件实现密码加密

博客系统需要注册用户,为了保证用户信息的安全,我们需要对用户的密码进行加密。为了实现这个功能,我们可以使用模式中间件来自动加密密码。

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

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

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

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

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

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

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

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

在上面的代码中,我们定义了一个 User 模型,并且在它的 Schema 中使用了模式中间件。在每次保存 User 实例时,都会先执行 pre('save') 的中间件:将密码进行加密。同时还定义了方法 comparePassword 来比较密码是否相等。

总结

在 Mongoose 中使用中间件可以很方便地实现一些常见的开发需求,如添加时间戳、上传文件、排序和密码加密等。中间件的分类和实现方法有一定的技巧和经验,需要在实际开发中多加练习和总结。

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

纠错
反馈