介绍
在 MongoDB 中,一个 document 对应一条记录(record),一个 collection 对应一个表(table),而一个 database 通常包含多个 collection。在 Mongoose 中,一个 model 对应一个 collection,而一个 mongoose 实例则包含多个 model。
在使用 Mongoose 进行数据存取时,我们会遇到一些场景需要对数据库字段进行处理,例如在创建记录时自动填充某些字段、在更新记录时对某些字段进行修改等等。这时,我们可以使用 Mongoose 中的中间件来实现。
本文将详细介绍 Mongoose 中使用中间件处理数据库字段的方法,并通过示例代码来指导读者如何应用。
Mongoose 中间件
Mongoose 中提供了四种类型的中间件:
pre
: 在执行操作之前执行的中间件,例如在保存记录前修改字段、在查找记录前过滤条件等。post
: 在执行操作之后执行的中间件,例如在保存记录后发送通知、在删除记录后进行清理等。document
: 对Document
对象应用的中间件,例如pre('save')
、post('update')
等,这些中间件实际上是对save()
、update()
等操作进行了封装。query
: 对Query
对象应用的中间件,例如pre('find')
、post('findOneAndUpdate')
等,这些中间件实际上是对find()
、findOneAndUpdate()
等操作进行了封装。
在本文中,我们主要介绍 pre
和 post
中间件,它们可以对保存、更新、删除等操作进行拦截和处理。
中间件的使用方法
在 Mongoose 中,我们可以使用 schema.pre()
和 schema.post()
方法来注册中间件。这两个方法都接收两个参数:第一个参数是要注册的中间件类型,第二个参数是中间件的回调函数。
以下是一个例子:
-- -------------------- ---- ------- ----- ---------- - --- ----------------- ---------- ------- --------- ------ --- ---------------------- -------- ------ - -- ----------- ------------------- ---------- ------- --- ----------------------- -------- ------ - -- ------------ ----------------- ------ -- ------ ---
上面的代码在保存记录前输出 Saving User...
,在保存记录后输出 User Saved:
并将保存的 user 对象作为参数输出。
中间件的回调函数可以在执行操作之前、之后或是在触发一些特定事件时被执行,例如 pre('save')
可以在执行 save()
操作之前被执行,而 post('save')
则在执行 save()
操作之后被执行。
另外,中间件的回调函数可以是一个异步函数,只需要在回调函数中调用 next()
或 done()
函数即可。如果回调函数中的操作是同步的,则不需要调用这两个函数。
示例代码
下面是一个在保存记录时自动填充创建时间和更新时间的示例代码:
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ---------- - --- ----------------- ---------- ------- --------- ------- ---------- ----- ---------- ---- --- ---------------------- -------- ------ - ----- ----------- - --- ------- -------------- - ------------ -- ----------------- - -------------- - ------------ - ------- --- ----- ---- - ---------------------- ------------ ----- ---- - --- ------ ---------- ------- --------- ----- --- ----------- -------------- -- - -------------------- -- ------------ -- - ------------------- ---
在上面的代码中,我们定义了一个 userSchema
,其中包含了 createdAt
和 updatedAt
字段。在 userSchema.pre('save', ...)
中,我们使用 this
来表示正在保存的记录,获取当前时间并将其赋值给 updatedAt
字段。如果记录中不存在 createdAt
字段,则同时将当前时间赋值给 createdAt
字段。最后,我们调用了 next()
函数来执行下一个中间件或是保存操作本身。
保存记录后,我们在控制台可以看到以下输出:
{ _id: 5fbc354a672a7028d94f9aab, firstName: 'John', lastName: 'Doe', createdAt: 2020-11-23T15:25:38.539Z, updatedAt: 2020-11-23T15:25:38.539Z, __v: 0 }
可以看到,创建时间和更新时间都已经被成功填充。
总结
本文介绍了在 Mongoose 中使用中间件处理 database 字段的方法,包括中间件的类型、注册方法和回调函数的使用方法。通过示例代码,我们也展示了一个在保存记录时自动填充创建时间和更新时间的示例。希望读者可以通过本文学习到 Mongoose 中间件的使用技巧,并在实际项目中应用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/648fd20d48841e9894df964b