Mongoose 是一个 Node.js 和 MongoDB 的桥梁,它使得在 Node.js 中使用 MongoDB 数据库变得非常容易和方便。在 Mongoose 中使用 Schema 来为数据库集合定义结构和验证规则,而插件可以用来增强 Schema 的功能。
Schema 插件的使用
Mongoose 的插件可以用来为 Schema 添加各种额外的功能。插件是一个带有一些方法的 JavaScript 对象,这些方法可以被绑定到 Schema 或 Model 上。插件的作用是增加某些行为的实现,比如增加一个预处理钩子,增加静态方法等等。插件可以全局使用,也可以在特定 Schema 和 Model 上使用。
全局插件
通过在 Mongoose 上注册一个全局插件,就可以让这个插件在所有的 Schema 和 Model 上都可用。例如,我们可以使用以下代码来添加一个全局的 toJSON()
方法,让我们在对每个模型进行 JSON 序列化时都能得到期望的对象:
-- -------------------- ---- ------- ----- -------- - ------------------- ---------------------- -- - --------------------- - - ---------- ----- ---- -- - ------ ------- ------ ------- ------ --- - - --展开代码
在上面的代码中,我们定义了一个全局插件,并定义了一个 toJSON()
方法,用于将返回 JSON 对象时的输出进行处理。在这种情况下,我们删除了 _id
和 __v
属性,确保在序列化对象时无需包含这些属性。
在特定 Schema 上使用插件
有时我们希望只有特定的 Schema 使用某个插件。这时候我们就需要在创建 Schema 时设置插件。例如:
-- -------------------- ---- ------- ----- -------- - ------------------- ----- - ------ - - -------- ----- ---------- - --- -------- --------- - ----- ------- --------- ---- -- --------- - ----- ------- --------- ---- - -- -- -- -------- -- ------------------------------------------------ -------------- - ---------------------- -----------展开代码
在上面的代码中,我们在创建 userSchema
时,调用了 plugin()
方法,并传递了 require('mongoose-lifecycle')
插件(假定我们已经安装了该插件)。这样,我们就在 userSchema
上增加了这个插件的方法和属性,在使用时就能够直接调用。
插件钩子
插件可以利用 Mongoose 生命周期钩子来拦截和修改数据存储行为。Mongoose 生命周期钩子的类型包括 init
、validate
、save
、remove
和 findOneAndUpdate
。插件提供的钩子可以帮助你在打破代码的同时保持整体性。
以下是一个使用插件 Pre 和 Post 钩子的示例,用来添加 "created_at" 和 "updated_at" 字段:
-- -------------------- ---- ------- ----- -------- - ------------------- ----- --------------- - ------ -- - ------------ ----------- ----- ----------- ---- -- ------------------ -------- ------ - ----- ----------- - --- ------ --------------- - ----------- -- ------------------ - --------------- - ----------- - ------ -- ------------------------------ -------- ------ - --------------- - ----- - ----------- --- ------ - -- ------ -- - ----- ---------- - --- ----------------- ----- ------ -- ---------------------------------- -------------- - ---------------------- -----------展开代码
在上面的代码中,我们通过 timestampPlugin
插件定义了两个字段 created_at
和 updated_at
,并且通过 pre 钩子在创建和更新时设置它们的值。
常用插件
下面是一些常用的 Mongoose 插件。
mongoose-timestamp
mongoose-timestamp 是一个简单的插件,它可以帮助我们轻松地添加 created_at
和 updated_at
字段。我们可以将其作为全局插件,也可以作为指定 Schema 上的插件使用。
-- -------------------- ---- ------- ----- -------- - ------------------- ----- --------- - ----------------------------- ----- ---------- - ----------------- ----- ------ -- ---------------------------- ----- ---- - ---------------------- -----------展开代码
注意,mongoose-timestamp
并不会使用日期时间索引,因为这需要额外的配置。
mongoose-hidden
很多时候,仅在将对象序列化为 JSON 格式或传递给前端时才需要隐藏某些字段,而不是像通常情况下那样将其暴露在 UI 上。使用 mongoose-hidden
插件,可以方便地在 toJSON、toObject 或 JSON.stringify() 时隐藏指定字段。
-- -------------------- ---- ------- ----- -------- - ------------------- ----- ------ - ---------------------------- ----- ---------- - ----------------- ----- ------- --------- - ----- ------- ----- ---- -- -- ---- ----- -------- -- - -- ------------------------- ----- ---- - ---------------------- -----------展开代码
mongoose-unique-validator
当存在唯一性要求时,mongoose-unique-validator
使验证和错误处理变得更加容易。在定义 Schema 时,我们可以这样使用它:
-- -------------------- ---- ------- ----- -------- - ------------------- ----- --------------- - ------------------------------------ ----- ---------- - ----------------- ------ - ----- ------- --------- ----- ------- ---- - -- ---------------------------------- ----- ---- - ---------------------- -----------展开代码
该插件会添加一个唯一性验证器到定义了 unique
属性的字段上,如果该字段不符合唯一性要求,则会抛出一个错误。
mongoose-autopopulate
mongoose-autopopulate
插件可以自动填充嵌套对象,以避免手动调用 populate()
。我们可以轻松地在创建 Schema 时启用该功能:
-- -------------------- ---- ------- ----- -------- - ------------------- ----- ------------ - -------------------------------- ----- ---------- - ----------------- ----- ------- -------- -- ----- ------------------------------- ---- ------- ------------- ---- -- -- ------------------------------- -------------- - ---------------------- -----------展开代码
使用 mongoose-autopopulate
插件后,只需要在 Schema 的字段上启用 autopopulate
标志,即可自动填充嵌套对象,这样就能避免手动调用 populate()
方法。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67cd9117e46428fe9e729b7f