Mongoose 中的模式设计与架构模式的设计

阅读时长 7 分钟读完

在 Web 应用程序的开发中,尤其是在构建数据库驱动的应用程序时,合理的数据模型是至关重要的。Mongoose 是一个优秀的 Node.js 库,提供了对 MongoDB 数据库的封装和抽象,方便开发人员进行数据库操作。在 Mongoose 中,模式是一个非常重要的概念,在实际应用中有着非常广泛的应用。本文将介绍 Mongoose 中的模式设计和架构模式的设计,包括模式的定义、插件和 middleware 的使用,以及如何用 Mongoose 实现数据库的数据验证和类型转换。

Mongoose 的模式设计

Mongoose 是基于模型/文档的 MongoDB 驱动程序。 应用程序的模型是指其数据结构,其中包括每个属性的名称,数据类型,默认值和验证规则等。模型指定了文档的结构,可以用于定义各种属性,从最基本的字符串到复杂的嵌套对象。

在 Mongoose 中,模式用于定义对 MongoDB 数据进行结构化描述。模式不仅定义了文档的属性和类型,还可以定义默认值、索引、方法、静态方法和虚拟属性等。定义一个简单的 Mongoose 模式如下所示:

在上面的代码中,我们定义了一个名为 userSchema 的模式,它包括四个属性:nameemailagecreatedAt,它们分别代表着用户的姓名、电子邮件、年龄和创建时间。其中 createdAt 属性用于记录创建该用户文档的时间,它的类型为 Date,类型转换器为 Date.now,默认值为当前日期。可以看到,在 Mongoose 中,定义模式非常方便,只需要调用 mongoose.Schema 函数,并将其传递给一个对象即可。

Mongoose 的插件和 middleware

在实际应用中,我们经常需要为 Mongoose 模型添加一些通用的功能,如数据验证、JSON 序列化等。这时候,我们可以使用 Mongoose 的插件和 middleware 来实现。

插件

Mongoose 的插件是一个包含模式和模型方法的简单 JavaScript 对象。它们允许将通用功能集成到模型中。一般来说,Mongoose 插件用于添加一些全局或本地的功能或中间件。

我们来看一下如何为 Mongoose 模型添加一个简单的插件。假设我们希望为 User 模型添加一个生成随机名称的方法,那么我们可以增加如下的代码:

在上面的代码中,我们调用了 userSchema.plugin 函数,将一个对象传递给它。在这个对象上,我们定义了一个名为 randomName 的方法,它从一个硬编码的数组中随机返回一个名称。这样,我们就为 User 模型添加了一个可复用的、随机返回名称的方法。

Middleware

Mongoose 的 middleware 是一些函数,用于在保存、更新、查询等过程中处理文档。它们允许你修改文档的属性,同时还可以进行异步操作。在 Mongoose 中,middleware 分为两种类型:pre 和 post。pre middleware 允许在操作之前进行文档处理,而 post middleware 则在操作完成后执行。

下面是一个示范,为 User 模型添加一个 pre middleware,用于保存用户之前对年龄属性进行处理:

在上面的代码中,我们使用 userSchema.pre 函数来定义一个 pre middleware。它将检查年龄属性是否为正整数。如果年龄属性不是正整数,则会抛出一个 Error。在处理完文档后,我们调用了 next(),告诉 Mongoose 继续进行操作。

Mongoose 数据验证

在实际应用中,我们还需要对数据进行验证。Mongoose 支持各种数据验证技术,包括内置的验证器和自定义验证器。内置的验证器包括必填项、数字范围、正则表达式、电子邮件格式等。自定义验证器则可以根据具体需求进行设计。下面是一个添加 Mongoose 验证器的示例:

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

在上面的代码中,我们为 nameemail 属性添加了必填项验证器。同时,对于 email 属性,我们使用了正则表达式验证电子邮件格式。对于 age 属性,我们增加了最小值验证规则。

除了上面的内置验证器外,您还可以使用自定义验证器。自定义验证器需要返回布尔值,以指示验证是否成功。你可以定义一个名为 validate 的验证函数,并将其作为 SchemaType 配置参数的 validator 属性传递:

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

在上面的代码中,我们定义了一个 size 属性,并添加了一个自定义验证器。该函数用于检查 size 是否为 small、medium 或 large。如果验证器返回 false,Mongoose 会抛出消息为 is not a valid size! 的错误。此外,我们还使用了内置的必填项验证器。

总结

在本文中,我们介绍了 Mongoose 中的模式设计和架构模式的设计。模式定义是 MongoDB 数据库设计的重要组成部分,Mongoose 方便了模式定义,提供了简洁易懂的模式定义方式。插件和 middleware 是对模型方法、文档中间件的抽象,它们可以使你的代码更加清晰简单。最后,我们介绍了 Mongoose 数据验证器,提供了内置的验证器和自定义验证器,以保证数据的有效性。

虽然本文从 Mongoose 的角度介绍了,但是其 对设计合理的数据库应用也 具有指导意义,可以帮助应用程序开发人员在应用中快速构成合理的数据模型,并增加了基本的保证和白话易懂的错误反馈。

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

纠错
反馈