在 NestJS 中,当你使用 Mongoose(一个 MongoDB 的 Node.js ODM 库)时,Mongoose 提供了许多预定义的钩子(hooks)方法,这些方法允许你在文档的生命周期中的特定阶段执行自定义逻辑。这些钩子在文档保存(save)或更新(通常也是通过 save 或其他 Mongoose 更新方法如 findOneAndUpdate)之前和之后被调用。
对于 Mongoose 来说,以下是一些可用的钩子:
- pre('save'): 在文档保存到数据库之前执行。
- post('save'): 在文档保存到数据库之后执行。
- pre('validate'): 在文档验证之前执行(在 save 过程中)。
- post('validate'): 在文档验证之后执行(在 save 过程中)。
- pre('updateOne'), pre('updateMany'), pre('replaceOne'): 在更新操作之前执行。
- post('updateOne'), post('updateMany'), post('replaceOne'): 在更新操作之后执行。
- pre('findOneAndUpdate'), pre('findOneAndReplace'), pre('findOneAndDelete'): 在查询和更新/替换/删除操作之前执行。
- post('findOneAndUpdate'), post('findOneAndReplace'), post('findOneAndDelete'): 在查询和更新/替换/删除操作之后执行。
示例
使用 pre('save'): 在文档保存到数据库之前自动执行一些业务。
比如自动给一些id添加唯一值。处理一些业务逻辑等等。
import { Schema, model, Document } from 'mongoose';
export interface MyDocument extends Document {
name: string;
id: string;
}
const MyDocumentSchema = new Schema({
name: String,
}, {
});
MyDocumentSchema.pre('save', function(next) {
console.log('Document will be saved!');
this['_doc'].id = this._id.toString()
next();
});
export const MyDocumentModel = model<MyDocument>('MyDocument', MyDocumentSchema);
post('save'): 在文档保存到数据库之后执行。
在数据库保存之后执行某些动作:
import { Schema, model, Document } from 'mongoose';
export interface MyDocument extends Document {
name: string;
}
const MyDocumentSchema = new Schema({
name: String,
}, {
});
MyDocumentSchema.post('save', function(doc) {
console.log('Document has been saved!');
});
export const MyDocumentModel = model<MyDocument>('MyDocument', MyDocumentSchema);