在 Web 应用程序的开发中,尤其是在构建数据库驱动的应用程序时,合理的数据模型是至关重要的。Mongoose 是一个优秀的 Node.js 库,提供了对 MongoDB 数据库的封装和抽象,方便开发人员进行数据库操作。在 Mongoose 中,模式是一个非常重要的概念,在实际应用中有着非常广泛的应用。本文将介绍 Mongoose 中的模式设计和架构模式的设计,包括模式的定义、插件和 middleware 的使用,以及如何用 Mongoose 实现数据库的数据验证和类型转换。
Mongoose 的模式设计
Mongoose 是基于模型/文档的 MongoDB 驱动程序。 应用程序的模型是指其数据结构,其中包括每个属性的名称,数据类型,默认值和验证规则等。模型指定了文档的结构,可以用于定义各种属性,从最基本的字符串到复杂的嵌套对象。
在 Mongoose 中,模式用于定义对 MongoDB 数据进行结构化描述。模式不仅定义了文档的属性和类型,还可以定义默认值、索引、方法、静态方法和虚拟属性等。定义一个简单的 Mongoose 模式如下所示:
const mongoose = require('mongoose'); const userSchema = new mongoose.Schema({ name: String, email: String, age: Number, createdAt: { type: Date, default: Date.now }, });
在上面的代码中,我们定义了一个名为 userSchema
的模式,它包括四个属性:name
、email
、age
和 createdAt
,它们分别代表着用户的姓名、电子邮件、年龄和创建时间。其中 createdAt
属性用于记录创建该用户文档的时间,它的类型为 Date,类型转换器为 Date.now,默认值为当前日期。可以看到,在 Mongoose 中,定义模式非常方便,只需要调用 mongoose.Schema
函数,并将其传递给一个对象即可。
Mongoose 的插件和 middleware
在实际应用中,我们经常需要为 Mongoose 模型添加一些通用的功能,如数据验证、JSON 序列化等。这时候,我们可以使用 Mongoose 的插件和 middleware 来实现。
插件
Mongoose 的插件是一个包含模式和模型方法的简单 JavaScript 对象。它们允许将通用功能集成到模型中。一般来说,Mongoose 插件用于添加一些全局或本地的功能或中间件。
我们来看一下如何为 Mongoose 模型添加一个简单的插件。假设我们希望为 User 模型添加一个生成随机名称的方法,那么我们可以增加如下的代码:
// add random name plugin userSchema.plugin(function (schema) { schema.methods.randomName = function () { const names = ['Alice', 'Bob', 'Carol', 'Dave', 'Eve', 'Frank']; return names[Math.floor(Math.random() * names.length)]; }; });
在上面的代码中,我们调用了 userSchema.plugin
函数,将一个对象传递给它。在这个对象上,我们定义了一个名为 randomName
的方法,它从一个硬编码的数组中随机返回一个名称。这样,我们就为 User 模型添加了一个可复用的、随机返回名称的方法。
Middleware
Mongoose 的 middleware 是一些函数,用于在保存、更新、查询等过程中处理文档。它们允许你修改文档的属性,同时还可以进行异步操作。在 Mongoose 中,middleware 分为两种类型:pre 和 post。pre middleware 允许在操作之前进行文档处理,而 post middleware 则在操作完成后执行。
下面是一个示范,为 User 模型添加一个 pre middleware,用于保存用户之前对年龄属性进行处理:
// add age pre middleware userSchema.pre('save', function (next) { if (this.age <= 0) { throw new Error('Age must be positive.'); } next(); });
在上面的代码中,我们使用 userSchema.pre
函数来定义一个 pre middleware。它将检查年龄属性是否为正整数。如果年龄属性不是正整数,则会抛出一个 Error
。在处理完文档后,我们调用了 next()
,告诉 Mongoose 继续进行操作。
Mongoose 数据验证
在实际应用中,我们还需要对数据进行验证。Mongoose 支持各种数据验证技术,包括内置的验证器和自定义验证器。内置的验证器包括必填项、数字范围、正则表达式、电子邮件格式等。自定义验证器则可以根据具体需求进行设计。下面是一个添加 Mongoose 验证器的示例:
-- -------------------- ---- ------- ----- ---------- - --- ---------------- - ----- - ----- ------- --------- ----- -- ------ - ----- ------- --------- ----- ------- ----- ------ --------------------------------------------- -- ---- - ----- ------- ---- -- -- -- - ----------- ---- - --
在上面的代码中,我们为 name
和 email
属性添加了必填项验证器。同时,对于 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