(10)被迫吃芒果的前端工程師 - Mongoose - String Validators

前言

上一篇我們認識了基本 Mongoose 的 Schema 寫法,接下來將會針對 Schema 來去認識。

SchemaType

Schema 本身支援所謂的型別驗證,在前面章節我們有撰寫一點基本的

1
2
3
4
5
const UserSchema = new mongoose.Schema({
account: String
password: String,
nickname: String,
});

但是通常來講我們會比較常用第二種寫法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const UserSchema = new mongoose.Schema({
account: {
type: String,
},
password: {
type: String,
},
nickname: {
type: String,
},
createTime: {
type: Date,
default: Date.now,
}
});

而 Type 支援的格式非常多,以下只列出比較常見的 SchemaType

  • String
  • Number
  • Boolean
  • Date
  • Object
  • ObjectID
  • Array

當然官方還有

  • Buffer
  • Map

…等等

Schema Validators

那為什麼要用第二種寫法呢?主要會跟 Schema Validators 有關,Validators 就是指驗證的部分。

而 Validators 非常多種,接下來也會一一介紹,因此可能會調整一下 UserSchema

Validators 最基本的就是 required 必填,舉例來講密碼跟帳號就是必填,而加上方式非常簡單

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const UserSchema = new mongoose.Schema({
account: {
type: String,
required: true,
}
password: {
type: String,
required: true,
},
nickname: {
type: String,
},
createTime: {
type: Date,
default: Date.now,
}
});

當然 required 也有另一種寫法,也就是陣列形式,而陣列形式的話,你可以自訂錯誤訊息,例如 nickname is required.,而使用方法的話只需要注意陣列中第一個是布林,第二個則是自訂的錯誤訊息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const UserSchema = new mongoose.Schema({
account: {
type: String,
required: true,
}
password: {
type: String,
required: true,
},
nickname: {
type: String,
required: [true, 'nickname is required.'],
},
createTime: {
type: Date,
default: Date.now,
}
});

String Validators

每一個 type 都有可以支援的 Validators 類型,以 String 來講就有以下

  • uppercase
  • lowercase
  • enum
  • minLength
  • maxLength

但實際上來講 uppercaselowercase 是非常少見的,主要是將資料轉換成全大寫或是全小寫,所以下面就不會說明了。

enum

enum 概念很像輸入「範圍」的概念,你想像成 HTML 的 Select 選單,例如使用者的職業類別有以下

  • 科技類
  • 電子類
  • 食品加工類
  • 營造業

那麼就可以這樣寫

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
const UserSchema = new mongoose.Schema({
account: {
type: String,
required: true,
}
password: {
type: String,
required: true,
},
nickname: {
type: String,
required: [true, 'nickname is required.'],
},
job: {
type: String,
enum: [
'科技類',
'電子類',
'食品加工類',
'營造業',
],
},
createTime: {
type: Date,
default: Date.now,
}
});

那麼透過 enum 的功能,使用者就只能輸入這四種類別而不能輸入這之外的,而這邊要注意若有設置 default 的話記得要放進入 enum

maxLength/minLength

maxLengthminLength 相對簡單很多,就是限制 String 可以輸入的長度範圍,例如暱稱不可以超過 20 個字且不得少於 3 個字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
const UserSchema = new mongoose.Schema({
account: {
type: String,
required: true,
}
password: {
type: String,
required: true,
},
nickname: {
type: String,
required: [true, 'nickname is required.'],
minLength: 3,
maxLength: 20
},
job: {
type: String,
enum: [
'科技類',
'電子類',
'食品加工類',
'營造業',
]
}
createTime: {
type: Date,
default: Date.now,
}
});

後面你可能會想說為什麼密碼不設置長度,主要原因會跟後面有關,只是這邊先不說明。