Mongoose 是一个针对 MongoDB 的 Node.js 对象建模工具,它使得在 Node.js 应用中使用 MongoDB 更加方便。Mongoose 提供了一个丰富的 API,其中最关键的是 Schema,它是指定数据库中文档的结构以及每个属性的类型、默认值等信息。
其中 Schema 校验及错误处理机制是 Mongoose 的核心功能之一。它确保在对数据库进行操作时,存储的值是有效的,从而减少应用程序中的错误。在本文中,我们将深入探讨 Mongoose 中的 Schema 校验以及错误处理机制,并提供详细的示例代码帮助读者更好地理解。
Schema 校验
MongoDB 是一种无模式的文档数据库,这意味着,您可以向 MongoDB 中插入任何类型的数据而不受约束。这是 MongoDB 的灵活性所在,但同时也增加了错误发生的可能性。
为了避免这种错误,Mongoose 提供了 Schema 校验机制,它能够确保只有经过验证的数据存储到数据库中。Schema 通过在验证之前对提交的数据进行检查来工作。
下面是一个示例的 Schema 对象:
----- ---------- - --- ----------------- ----- - ----- ------- --------- ---- -- ------ - ----- ------- --------- ----- ------- ---- -- ------ - ----- ------- --------- ----- ------- ---- -- --------- - ----- ------- --------- ---- -- ---------- - ----- ----- -------- -------- - ---
在这个例子中,我们定义了一个名为 userSchema 的 Schema。它包含了 5 个属性:name、email、phone、password 和 createdAt。这些属性定义了在 MongoDB 中文档的结构以及每个属性的类型、默认值等信息。在这个示例中,我们使用了 Mongoose Schema 提供的验证器。
required
验证器用于验证属性是否非空。如果添加了 required: true
,那么当试图保存一个不包含该属性的文档时会抛出 ValidationError。
unique
验证器用于验证属性的唯一性。如果添加了 unique: true
,那么当试图保存一个重复的属性值时会抛出 ValidationError。
在这里,phone 和 email 属性都使用了 unique
校验器。因此,如果试图保存一个 phone
或 email
属性值已在数据库中存在的文档时,将会抛出错误。
自定义验证器
除了内置验证器之外,您还可以编写自己的验证器来验证一个值是否合法。自定义验证器应该是一个函数,并接收一个参数,它是要尝试验证的值。如果值无效,则应该抛出 ValidationError。
下面是一个示例自定义验证器函数:
-------- ------------ - ------ ------------------------------ - ----- ---------- - --- ----------------- ---- - ----- ------- --------- ----------- -------- ----- - ---
在这个示例中,我们定义了一个名为 ssn
的属性,并将一个自定义验证器函数 validator
传递给 validate
选项。validate
选项是一个数组,其中第一个元素是要调用的函数,第二个元素是将被显示的错误消息。
异步验证器
有时,验证可能需要从外部源读取数据或执行异步操作。为此,Mongoose 允许创建异步验证器。异步验证器函数应该接收两个参数:value
和 callback
。如果验证成功,回调应该以空值作为第一个参数调用。否则,它应该以一个 ValidationError 对象作为第一个参数调用。
下面是一个示例异步验证器函数:
----- --------------- - ------------- --------- - --------------------- - -- ---- --- ----------- - ------------ ----------------- ---------- - ---- - ----------- - -- --- -- ----- -------------- - --- ----------------- ---------- - ----- ------- --------- - ---------- ---------------- -------- -------- ----- --------- ----- -------- - - ---
在这个示例中,我们定义了一个名为 testField
的属性,并将一个自定义异步验证器函数 customValidator
传递给 validate
选项。在这个示例中,我们使用了自定义错误消息,类型是 custom
。
错误处理
当发生错误时,Mongoose 将 ValidationError 对象视为错误。这种错误的一般结构包括一个 message
属性,它描述了引起 ValidationError 的问题。
您可以使用 Mongoose 提供的错误方法之一,例如 save()
、create()
或 update()
, 在保存一个文档时,将自动抛出 ValidationError。
下面是一个示例使用 Mongoose 中的错误方法:
----- ---- - --- ------ ----- ------- ------ ------------------- ------ ----------- --------- ---------- --- --------------- -- - -- ----- - ------------------- - ---- - ----------------- ----- ---------------- - ---
在这个示例中,我们创建了一个新的用户对象,然后使用 Mongoose 的 save()
方法将其保存到数据库中。如果存在错误,则将错误打印到控制台。
当您使用 mongoose.Model.validate()
方法验证文档时,将不会抛出 ValidationError。如果存在错误,它们将存储在文档的 errors
对象中,其中键是属性名称,值是 ValidationError 对象。
下面是一个示例验证文档并处理错误的示例:
------------------- -- - -- ----- - -------------------------- - ---- - ----------------- -- --------- - ---
在这个示例中,我们调用 validate()
方法来验证文档。如果存在错误,则将错误信息打印到控制台。
结论
在本文中,我们深入探讨了 Mongoose 中的 Schema 校验及错误处理机制。我们介绍了如何使用内置和自定义验证器来验证文档,并查看了如何使用 Mongoose 以及文档的 errors
对象来处理 ValidationError。
了解并实践 Schema 校验及错误处理机制可以确保有效且良好设计的文档对象存储在数据库中,从而降低开发者的维护成本和应用程序中错误的数量。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/67319fcd0bc820c58239803c