在 MongoDB 的 Node.js 驱动程序之一的 Mongoose 中,模型(即所谓的 Schema,或预定义的结构)可以定义各种校验规则,以确保数据的完整性和正确性。在本文中,我们将深入探讨 Mongoose 的校验规则,涵盖各种表单验证、业务逻辑限制以及定制校验器的示例和指导。
基本校验规则
下面是一些最常见的字段校验规则:
required
:必填字段。例如,我们可以这样定义一个用户名字段:username: { type: String, required: true }
,这样在尝试插入一个缺少用户名的文档时,会收到如下错误:ValidationError: Path
usernameis required.
min
/max
:限制数字或日期的最小或最大值。例如:age: { type: Number, min: 18 }
,限制年龄字段的最小值为 18。enum
:限制字段只能是指定的值之一。例如:gender: { type: String, enum: ['Male', 'Female'] }
,在这个示例中,gender 字段必须为男性或女性之一。match
:使用正则表达式验证字段的格式。例如,我们可以这样限制用户名只能包含小写字母和数字:username: { type: String, match: /^[a-z0-9]+$/ }
。
当未满足定义的校验规则时,Mongoose 会抛出一个 ValidationError 异常。
高级校验规则
除了上述基本校验规则之外,Mongoose 还提供了一些更高级的校验规则。
自定义校验器
由于 Mongoose 的校验规则是开放的,因此您可以编写自己的校验器,以验证字段并执行各种其他操作。例如,以下示例定义了一个 caption 字段,以确保它在评论中唯一(即每个评论都有唯一的标题):
----- ------------- - --- ----------------- -------- - ----- ------- --------- - ---------- ----- ----------- - ----- ------- - ----- -------------------------- -------- - --- -- --------- - -- -------- --- ----------- - ------ ----- - ------ ------ - ------ ----- -- -------- ----- -- -------- -------------- ------- -------- - - ---
上面的示例中,将 validate
属性设置为一个字面量对象,该对象具有 validator
函数,该函数接受待验证的值并返回一个解析为 true 或 false 的 Promise。此外,还有一个可选的 message
属性,用于在验证失败时提供更具体的错误消息。
异步校验规则
Mongoose 甚至允许您使用异步函数来实现您的自定义校验器。例如,以下示例定义了一个 username 字段,以确保该用户名不存在于数据库中:
----- --------- - ----- --------------- - ----- ---- - ----- -------------- --------- ----- --- -- ------ - ------ ------ - ------ ----- - ----- ---------- - --- ----------------- --------- - ----- ------- --------- - ---------- -------- --------- ------- -------- - - ---
在上述示例中,我们定义了一个名为 validator
的常规异步函数,并在 validate
属性中使用它。这种用法基本上是将异步函数作为一个选项传递给对象,同时允许使用选项中定义的其他任何属性。
正则表达式校验规则
Mongoose 还可以使用“string”类型字段的正则表达式进行验证,就像使用 JavaScript 原生的 RegExp
对象一样。例如,以下示例校验一个 URL 字段:
----- ---------- - --- ----------------- ---- - ----- ------- ------ ----------------------------------------- -- ---
在上述示例中,我们定义了一个正则表达式来验证 URL,如果该字符串与正则表达式匹配,则该字段将被视为经过验证。
结论
在本文中,我们介绍了 Mongoose 中的基本和高级校验规则,并提供了各种示例和指导。了解和正确使用这些规则是保证数据完整性和正确性的关键,同时可以节省大量的调试和错误处理时间。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6704e8eed91dce0dc850be5d