一、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系列之登陆注册接口的实现

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值