(19)被迫吃芒果的前端工程師 - Mongoose 之 Middleware

前言

等等!Mongoose 中也有 Middleware 的存在,Middleware 的概念其實就是中間層,你在進入或者在做某件事情之前必須先經過中間層,而 Mongoose 這個 Middleware 也是非常好用的。

Middleware

剛剛有提到 Middleware 的概念就是在進入或者要做某件事情中前必定會先經過這個中間層(Middleware),在後端來講最常見的就是在進入 router 之前先驗證使用者是否有登入 or Token 有效等。

而 Mongoose 本身也有支援 Middleware,舉例來講在我儲存資料之前,必須先輸出一些字眼,那就這樣寫,記得這個是寫在 model/User.js 的

1
2
3
4
5
6
7
8
9
10
11
const userSchema = new mongoose.Schema({
...
})

userSchema.pre('save', function() {
console.log('這是儲存時才會出現的話。')
})

const User = mongoose.model('User', userSchema);

module.exports = User;

主要是透過 pre 這個函式,並且第一個參數就是要監聽的事件或行為,第二個參數則是要呼叫的函式,因此這時候你試著寫入一些新資料就會自動觸發這個 Middleware

1
2
3
4
5
6
7
8
9
10
11
var judy = new User({
account: 'judy',
password: 'test1234',
nickname: 'judy',
age: 48,
job: '營造類',
})

judy.save().then((data) => {
console.log(data);
});

執行後你可以看到 presave 事件是會在儲存之前就被觸發了

save

因此我們可以知道 pre 是在做某件事情之前就觸發這個函式,但如果是觸發之後呢?觸發之後則是 post

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const userSchema = new mongoose.Schema({
...
})

userSchema.pre('save', function() {
console.log('這是儲存時才會出現的話。')
})

userSchema.post('save', function() {
console.log('這是儲存之後才會出現的話。')
})

const User = mongoose.model('User', userSchema);

module.exports = User;

當你儲存成功後就會觸發 save

post

那如果你出現驗證錯誤或者儲存失敗的話,其實是不會觸發 post 的唷。