Mongoose는 특정 작업 실행 전후(특정 Mongoose Method 호출 전후)에 코드를 실행할 수 있게 해줌.
따라서 어떤 것이 삭제되거나 저장되기 직전이나 함수를 호출할 때도 코드를 실행할 수 있다.
작업할 수 있는 전체 목록을 볼 수 있고 pre 혹은
post hook(데이터 전송 과정에서의 전처리 ) 혹은 미들웨어를 실행할 수 있다.
메소드를 만들땐, 스키마를 모델화 하기 전에 정의한다.
const mongoose = require("mongoose");
mongoose.set("strictQuery", true);
mongoose
.connect("mongodb://localhost:27017/shopApp")
.then(() => {
console.log("Connection Open!!!");
})
.catch((err) => {
console.log("ERROR!!!!!!!!!!!!!");
console.log(err);
});
const { Schema } = mongoose;
const personSchema = new Schema({ first: String, last: String });
personSchema.virtual("fullName").get(function () {
return `${this.first} ${this.last}`;
});
// Middleware function
personSchema.pre("save", async function () {
console.log("About To Save!!!");
});
personSchema.post("save", async function () {
console.log("Just Saved!!!!!!");
});
const Person = mongoose.model("Person", personSchema);
## (REPL)
> node -i -e "$(< index.js)"
Welcome to Node.js v18.13.0.
Type ".help" for more information.
> Connection Open!!!
> const k = new Person({first: "Kristen", last: "Sun"})
undefined
> k.save()
Promise {
<pending>,
[Symbol(async_id_symbol)]: 540,
[Symbol(trigger_async_id_symbol)]: 5
}
> About To Save!!!
Just Saved!!!!!!
...
personSchema.pre("save", async function () {
this.first = "YO";
this.last = "MAMA";
console.log("About To Save!!!");
});
...
> node -i -e "$(< index.js)"
Welcome to Node.js v18.13.0.
Type ".help" for more information.
> Connection Open!!!
> const hong = new Person({first:"GILDONG",last:"HONG"})
undefined
> hong
{
first: 'GILDONG',
last: 'HONG',
_id: new ObjectId("63d6a06f7c36674a834912d9")
}
> hong.save().then(p => console.log(p))
Promise {
<pending>,
[Symbol(async_id_symbol)]: 708,
[Symbol(trigger_async_id_symbol)]: 706
}
> About To Save!!!
Just Saved!!!!!!
{
first: 'YO',
last: 'MAMA',
_id: new ObjectId("63d6a06f7c36674a834912d9"),
__v: 0
}