Mongoose 是一个在 Node.js 环境下操作 MongoDB 数据库的工具,它提供了一种方便的方式来定义数据模型和操作数据。在 Mongoose 中,Schema 是用来定义数据模型的,每个 Schema 对象都包含了一些方法,比如 pre() 和 post()。
Schema.pre() 和 Schema.post() 函数
Schema.pre() 和 Schema.post() 函数是 Mongoose 中非常重要的两个方法,它们可以用来在执行数据库操作之前或之后执行一些逻辑。在 Schema 中,pre() 函数会在执行某个操作之前被调用,而 post() 函数则会在执行某个操作之后被调用。
下面是 pre() 和 post() 函数的基本语法:
schema.pre('操作名称', function(next) {
// 在执行操作之前执行的逻辑
next();
});
schema.post('操作名称', function(doc) {
// 在执行操作之后执行的逻辑
});其中,操作名称 是指要执行的操作的名称,比如 save、update、remove 等。next 是一个回调函数,如果在 pre() 函数中没有出现错误,则需要调用 next() 函数来继续执行操作。
Schema.pre() 和 Schema.post() 函数的使用场景
使用场景一:中间件
在 Mongoose 中,pre() 和 post() 函数常常被用来实现中间件(Middleware)。中间件是一种在执行某个操作之前或之后执行一些逻辑的方式,它可以用来实现一些常见的功能,比如校验数据、自动填充数据、记录操作日志等等。
下面是一个使用 pre() 函数实现中间件的例子:
schema.pre('save', function(next) {
// 校验数据
if (this.name === '') {
next(new Error('名称不能为空!'));
} else {
next();
}
});在上面的例子中,我们在保存数据之前校验了数据的名称是否为空,如果为空则返回一个错误,否则继续执行保存操作。
使用场景二:自动填充数据
在 Mongoose 中,pre() 函数还可以用来自动填充数据。比如,我们可以在保存数据之前自动填充一些默认值,比如创建时间、更新时间等等。
下面是一个使用 pre() 函数实现自动填充数据的例子:
schema.pre('save', function(next) {
// 自动填充创建时间和更新时间
const now = new Date();
this.createdAt = now;
this.updatedAt = now;
next();
});在上面的例子中,我们在保存数据之前自动填充了创建时间和更新时间。
使用场景三:记录操作日志
在 Mongoose 中,pre() 和 post() 函数还可以用来记录操作日志。比如,我们可以在保存数据之前记录一条日志,表示正在保存数据。
下面是一个使用 pre() 函数记录操作日志的例子:
schema.pre('save', function(next) {
// 记录操作日志
console.log(`正在保存数据:${this}`);
next();
});在上面的例子中,我们在保存数据之前记录了一条日志,表示正在保存数据。
示例代码
下面是一个完整的示例代码,演示了如何使用 pre() 和 post() 函数实现中间件、自动填充数据和记录操作日志:
// www.javascriptcn.com code example
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const UserSchema = new Schema({
name: String,
email: String,
createdAt: Date,
updatedAt: Date,
});
UserSchema.pre('save', function(next) {
// 校验数据
if (this.name === '') {
next(new Error('名称不能为空!'));
} else {
next();
}
});
UserSchema.pre('save', function(next) {
// 自动填充创建时间和更新时间
const now = new Date();
this.createdAt = now;
this.updatedAt = now;
next();
});
UserSchema.post('save', function(doc) {
// 记录操作日志
console.log(`保存数据成功:${doc}`);
});
const UserModel = mongoose.model('User', UserSchema);
const user = new UserModel({
name: '张三',
email: 'zhangsan@example.com',
});
user.save()
.then(() => {
console.log('保存数据成功!');
})
.catch((err) => {
console.error(`保存数据失败:${err}`);
});在上面的示例代码中,我们定义了一个 UserSchema,包含了 name、email、createdAt 和 updatedAt 四个字段。然后,我们使用 pre() 函数实现了两个中间件,一个用来校验数据,一个用来自动填充创建时间和更新时间。最后,我们使用 post() 函数实现了一个记录操作日志的中间件。最后,我们创建了一个 UserModel 对象,并保存了一条数据,保存成功后会输出一条日志。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d9340ca941bf71340bdcf9