4.3.Mongoose模塊化
#4.3.1.為什么要進(jìn)行模塊化拆分赘被?
模塊化拆分的目的是為了代碼的復(fù)用衰伯,讓整個(gè)項(xiàng)目的結(jié)構(gòu)更加清晰,舉個(gè)例子:當(dāng)數(shù)據(jù)庫(kù)中的集合變多的時(shí)候墅垮,例如有課程惕医、訂單、分類算色、教師等多個(gè)集合抬伺,我們將每個(gè)集合的代碼拆分到不同的模塊,這樣項(xiàng)目結(jié)構(gòu)會(huì)清晰很多灾梦,同時(shí)峡钓,這些模塊都要連接數(shù)據(jù)庫(kù)齐鲤,每個(gè)模塊都去連接一遍數(shù)據(jù)庫(kù)顯然是不合理的寫法,正確的做法是把連接數(shù)據(jù)庫(kù)的代碼單獨(dú)拆分出來椒楣,供各個(gè)模塊連接數(shù)據(jù)庫(kù)的時(shí)候使用
#4.3.2.拆分步驟
#1.把數(shù)據(jù)庫(kù)連接代碼拆分出去
在項(xiàng)目目錄下新建model目錄给郊,在model目錄下新建db.js文件,這個(gè)文件用于存放數(shù)據(jù)庫(kù)連接代碼
model/db.js代碼
// 1.引入mongoose
const mongoose = require('mongoose')
// 2.連接數(shù)據(jù)庫(kù)
mongoose.connect('mongodb://testadmin:nodeing123@127.0.0.1:27017/test', {useNewUrlParser: true}, (err) => {
if (err) {
console.log(err)
return
}
console.log('數(shù)據(jù)庫(kù)連接成功')
})
module.exports = mongoose
#2.把Schema的定義和模型的創(chuàng)建拆分出去
model/users.js中的代碼
let mongoose = require('./db')
// 3.定義Schema捧灰,例如:現(xiàn)在需要操作user集合(表)淆九,我們就需要給這個(gè)集合定義一個(gè)對(duì)應(yīng)的Schema
let UserSchema = mongoose.Schema({
name: String,
age: Number,
status: Number,
gender: {
type: String,
default: '男'
}
})
// 4.創(chuàng)建模型
let User = mongoose.model('User', UserSchema)
module.exports = User
#3.在需要的地方使用上面拆除去的模塊
新建一個(gè)app.js來測(cè)試是否可用
let UserModel = require('./model/users')
// 增加數(shù)據(jù)
let UserObj = new UserModel({
name: '張三',
age: 20,
status: 0
})
UserObj.save()
項(xiàng)目結(jié)構(gòu)圖:
#4.4.Mongoose預(yù)處理保存的數(shù)據(jù)
在定義Schema的時(shí)候,可以帶上一些預(yù)定義的處理器毛俏,可以幫助我們處理需要保存到數(shù)據(jù)庫(kù)的數(shù)據(jù)
#4.4.1.lowercase
定義Schema的時(shí)候帶上lowercase炭庙,可以把需要保存的數(shù)據(jù)轉(zhuǎn)成小寫
let UserSchema = mongoose.Schema({
name: {
type: String,
lowercase: true
},
age: Number,
status: Number,
gender: {
type: String,
default: '男'
}
})
下面例子中name字段的值為全大寫:
// 增加數(shù)據(jù)
let UserObj = new UserModel({
name: 'NONDEING',
age: 28,
status: 0
})
UserObj.save()
因?yàn)槭褂昧薼owercase,所以保存到數(shù)據(jù)庫(kù)中的數(shù)據(jù)是經(jīng)過處理了的:
#4.4.2.uppercase
uppercase是將字段值轉(zhuǎn)成大寫煌寇,這個(gè)和lowercase類似
let UserSchema = mongoose.Schema({
name: {
type: String,
uppercase: true
},
age: Number,
status: Number,
gender: {
type: String,
default: '男'
}
})
保存數(shù)據(jù)的時(shí)候焕蹄,name值全為小寫:
// 增加數(shù)據(jù)
let UserObj = new UserModel({
name: 'nodeing',
age: 28,
status: 0
})
UserObj.save()
保存到數(shù)據(jù)庫(kù)后,被轉(zhuǎn)成了大寫:
#4.4.3.trim
trim的作用是去除兩邊的空格
let UserSchema = mongoose.Schema({
name: {
type: String,
uppercase: true
},
age: Number,
status: Number,
gender: {
type: String,
trim: true,
default: '男'
}
})
保存的數(shù)據(jù)如下:
// 增加數(shù)據(jù)
let UserObj = new UserModel({
name: 'nodeing',
age: 28,
status: 0,
gender: " 女 "
})
保存到數(shù)據(jù)庫(kù)后的結(jié)果如下:
更多預(yù)處理器可以查看文檔:https://cn.mongoosedoc.top/docs/schematypes.html
#4.4.4.自定義處理器
如果mongoose提供的預(yù)處理器沒辦法滿足你的需求阀溶,你也可以自定義預(yù)處理器腻脏,舉個(gè)例子:保存url的時(shí)候,我們規(guī)定必須保存http協(xié)議银锻,這個(gè)時(shí)候就需要自定義一個(gè)預(yù)處理器去滿足需求
需求詳解:
當(dāng)保存這樣的數(shù)據(jù): www.baidu.com 我們希望處理后的結(jié)果為:http://www.baidu.com
定義Schema的時(shí)候永品,代碼如下:
let UserSchema = mongoose.Schema({
name: {
type: String,
uppercase: true
},
age: Number,
status: Number,
gender: {
type: String,
trim: true,
default: '男'
},
pic: {
type: String,
set (params) {
if (params.indexOf('http://') != 0 || params.indexOf('https://') !=0 ) {
return "http://"+params
}
return params
}
}
})
保存的數(shù)據(jù)如下:
// 增加數(shù)據(jù)
let UserObj = new UserModel({
name: 'nodeing',
age: 28,
status: 0,
gender: " 女 ",
pic: "www.baidu.com"
})
處理后的數(shù)據(jù)如下: