一、node系列之數據庫mongoose的封裝

1、mongoose介紹

Mongoose是在node.js異步環境下對mongodb進行便捷操作的對象模型工具

2、安裝mongoose

cnpm i mongoose -S

3、封裝目錄結構

|-sql
	|-collection
		-users.js
	-db.js
	-index.js

4、連接數據庫

一定要記得將連接數據庫的封裝成模塊 db.js

// db.js
const mongoose = require('mongoose');
// 1908shop 是表示數據庫的名稱
const DB_URL = 'mongodb://localhost:27017/1908shop';

mongoose.connect(DB_URL, { useNewUrlParser: true });

mongoose.connection.on('connected', () => {
  console.log('數據庫連接成功')
})

mongoose.connection.on('disconnected', () => {
  console.log('數據庫斷開')
})

mongoose.connection.on('error', () => {
  console.log('數據庫連接異常')
})

// 將此文件作爲一個模塊 暴露出去,供別人調用
module.exports = mongoose;

4、創建數據庫模型,以用戶集合爲例

說明各個字段的數據類型,切記使用過程中一定要記得數據類型的正確性

// sql/collection/users.js
const mongoose = require('./../db.js'); // 引入數據庫連接模塊
const Schema = mongoose.Schema; // 拿到當前數據庫相應的集合對象

// 設計用戶表的集合
const userSchema = new Schema({ // 設計用戶集合的字段以及數據類型
  userid: {type: String },
  username: { type: String },
  password: { type: String },
  tel: { type: String }
})

module.exports = mongoose.model('User', userSchema);

5、封裝數據庫操作

搭建數據庫模塊sql/index.js

module.exports = {
	insert () { // 插入
	},
	delete () { // 刪除
	},
	update () { // 更新
	},
	find () { // 查詢
	} ,
	paging () { // 分頁查詢
	},
	distinct () { // 按照分類查詢數據
	}
}

5.1 插入操作封裝

module.exports = {
	// 數據庫集合靠函數去傳遞
  insert (CollectionName, insertData) {
    // 數據庫的操作屬於異步操作,後續的業務邏輯會交給執行的那個單位
    // A 調用了B B包含異步操作,操作完畢 A繼續執行業務邏輯
    // 異步操作  --- 回調函數 / promise / generator + yeild / async + await
    // User.insertMany(insertData, (err) => {
    //   if (err) throw err;
    //   console.log('插入成功')
    // })
    // promise的寫法
    // return new Promise((resolve, reject) => {
    // })
    return new Promise((resolve, reject) => {
      CollectionName.insertMany(insertData, (err) => {
        if (err) throw err;
        resolve()
      })
    })
  },
}

5.2 刪除操作封裝

module.exports = {
	delete (CollectionName, deleteData, deleteType) {
    // User.deleteOne(deleteData, (err) => {})
    // User.deleteMany(deleteData, (err) => {})

    // style.display = "none"   <===>  style['display'] = "none"
    // style.animation = "test" 兼容性 
    // 對象後的屬性不可以是變量,如果有變量,寫成 對象[屬性] 形式
    
    deleteType = deleteType || 'deleteOne' // 默認爲刪除單條數據

    return new Promise((resolve, reject) => {
      CollectionName[deleteType](deleteData, (err) => {
        if (err) throw err;
        resolve()
      })
    })
  }
}

5.3 更新操作封裝

module.exports = {
	update (CollectionName, whereObj, updateObj, updateType) {
	    updateType = updateType || 'updateOne'
	    return new Promise((resolve, reject) => {
	      CollectionName[updateType](whereObj, updateObj, (err) => {
	        if (err) throw err;
	        resolve()
	      })
    })
  }
}

5.4 查詢操作封裝

module.exports = {
	find (CollectionName, whereObj, showObj) {
	    return new Promise((resolve, reject) => {
	      CollectionName.find(whereObj, showObj).exec((err, data) => {
	        if (err) throw err;
	        resolve(data)
	      })
	    })
	  }
}

5.5 分頁查詢操作

pageCode 表示頁碼,從0開始

module.exports = {
	paging (CollectionName, whereObj, showObj, limitNum, pageCode) {
	    return new Promise((resolve, reject) => {
	      // limit(limitNum) 每頁顯示個數
	      // skip(limitNum * pageCode) // 每頁從哪一個開始
	      CollectionName.find(whereObj, showObj).limit(limitNum).skip(limitNum * pageCode).exec((err, data) => {
	        if (err) throw err;
	        resolve(data)
	      })
	    })
	  },
}

5.6 按照分類查詢數據

module.exports = {
	distinct(CollectionName, name) {
    	return new Promise((resolve, reject) => {
	      CollectionName.distinct(name).exec((err, data) => {
	        if (err) throw err;
	        resolve(data)
	      })
	    })
	  }
}

6、預告

下次分享node系列之登陸註冊接口的實現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章