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