Node.js-MongoDB數據庫:Mongoose對象模型庫操作之中間件及pre和post鉤子

Data菌 2022-01-08 05:32:42 阅读数:520

node.js-mongodb node js mongodb mongoose

本篇介紹中間件的概念,中間件稱前置(pre)和後置(post)鉤子,在模式(Schema)級別指定,有4種類型的中間件:文檔(document)中間件包括init/validate/save/remove,模型(model)中間件包括insertMany,聚合(aggregate)中間件包括aggregate和查詢(query )中間件包括count/find/findOne/findOneAndRemove/findOneAndUpdate/remove/update/updateOne/updateMany。在這些方法事件注册上“pre”方法或後置“post”方法,就是在執行該方法前會先執行pre方法,完後再執行post方法。

測試代碼如下

/**
* MongoDB數據庫操作:mongoose對象模型庫之中間件pre和post鉤子
*/
const mongoose = require("mongoose");
const { compileFunction } = require("vm");
//與數據庫建立連接
mongoose.connect("mongodb://127.0.0.1:27017/studentdb",{useNewUrlParser: true, useUnifiedTopology: true});
const conn = mongoose.connection;
conn.on("error",(err)=>{
console.error("數據庫連接失敗:"+err);
});
conn.once("open",()=>{
console.log("數據庫連接成功!");
});
//模式定義:主要指定對應的MongoDB集合的字段和字段類型。
let studentSchema = mongoose.Schema({
Id:{type:String,required:[true,"Id不能為空"]},//內置驗證器
Name:String,
Age:{type:Number,min:[1,"年齡不能小於0"],max:100},
Weight:Number
});
//pre鉤子注册:
studentSchema.pre("init",(doc)=>{
console.log("pre-init");
});
studentSchema.pre("validate",(next)=>{
console.log("validate");
next();
});
studentSchema.pre('save', function (next) {
console.log('save');
next();
});
studentSchema.pre('find', function(next) {
console.log('find');
next();
});
//post鉤子注册:
studentSchema.post("init",(doc)=>{
console.log("post-init");
});
studentSchema.post("validate",(doc,next)=>{
console.log("post-validate");
next();
});
studentSchema.post('save', function (doc,next) {
console.log('post-save');
next();
});
studentSchema.post('find', function (doc,next) {
console.log('post-find');
next();
});
//模型創建:將模式編譯成模型
let Student = mongoose.model("students",studentSchema);
//save方法引起的相關已注册的鉤子的執行
let studentObj = new Student({"Id":1005,"Name":"WQ","Age":1,"Weight":34.5});
studentObj.save((err,doc)=>{
if(err) throw err;
console.log("1.使用實例save()方法保存成功!");
});
//find方法引起的相關已注册的鉤子的執行
Student.find((err,students)=>{
if(err) throw err;
console.log("查詢所有學生結果如下:");
console.log(students.toString());
});

 

 鉤子方法類似注册在mongoose對象模型數據庫操作API的前置驗證或後置的處理。相當於是對內置中間件方法的擴展處理。

版权声明:本文为[Data菌]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201080532424822.html