(16)被迫吃芒果的前端工程師 - Mongoose 之 Update 奇妙的狀況

前言

接下來回過頭聊一下 Update 的部分,其實 Update 有個很特別的地方與狀況,但沒有講到,所以特別挪一篇來聊聊。

Update 奇妙的狀況

我們知道當 Schema 型別與範圍如果不正確的話再新增時就會出現錯誤,例如年齡上限是 99 但我寫到 100,然後行業我寫了 enum 沒有的園藝業

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var mike = new User({
account: 'mike',
password: 'test1234',
nickname: 'mike',
age: 100,
job: '園藝業',
})

mike.save()
.then(() => {
console.log('Save');
})
.catch((e) => {
console.log(e)
})

這時候寫入時就會出現錯誤

出錯

但是這時候如果你使用 findOneAndUpdate 卻會成功更新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
User.findOneAndUpdate(
{
nickname: 'RayXu'
},
{
nickname: 'Ray',
age: 100,
job: '賣雞排',
},
{
new: true,
}
).then((data) => {
console.log('data', data)
})

更新成功

看到這邊你應該會覺得「oh!這一定是 Mongoose 的 Bug!」,其實這不算是 Mongoose 的 Bug,而是在做 Update 的時候必須替 option 額外多一個設置它才會針對 Update 做驗證

這邊先讓我還原一下資料

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
User.findOneAndUpdate(
{
nickname: 'Ray'
},
{
nickname: 'RayXu',
age: 25,
job: '科技業',
},
{
new: true,
}
).then((data) => {
console.log('data', data)
})

還原之後,這邊我們要調整一下 findOneAndUpdate,只需要針對 option 加上 runValidatorstrue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
User.findOneAndUpdate(
{
nickname: 'RayXu'
},
{
age: 100,
job: '賣雞排',
},
{
new: true,
runValidators: true,
}
).then((data) => {
console.log('data', data)
})

這時候你在試著更新一次就會發現驗證正常運作了

正常驗證

因此在更新時,runValidators 的選項是比較需要注意的地方。