前面我们已经做完了环境的部署和基本的测试,现在我们要开始使用我们的mongoose来连接我们的数据库,做到前后端分离这样一个操作,也就是经常说的mvc(model view controller),在model和controller之间经常需要一些工具来进行对接,帮助完成数据库的操作和通讯
什么是mongoose呢:Mongoose是一个开源封装好的实现Node和Mongodb数据通讯的数据建模库
第一步,安装我们的mongoose
npm install mongoose --save
接下来我们在我们的service下面建立一个新的文件夹database,来存放我们数据库相关的文件,然后我们建立一个init.js文件,用来做数据库的连接和初始化
const mongoose = require('mongoose')
const db = "mongodb://localhost/simle-db"
mongoose.Promise = global.Promise
exports.connect = ()=>{
//连接数据库
mongoose.connect(db)
//增加数据库连接的事件监听
mongoose.connection.on('disconnected',()=>{
//进行重连
mongoose.connect(db)
})
//数据库出现错误的时候
mongoose.connection.on('error',err=>{
console.log(err)
mongoose.connect(db)
})
//链接打开的时候
mongoose.connection.once('open',()=>{
console.log('MongoDB Connected successfully!')
})
}
写完之后我们再去service/index.js 里面加入立即执行函数,在使用前要加入connect
const { connect } = require('./database/init.js')
然后添加立即执行函数
//立即执行函数
(async ()=>{
await connect()
})()
到这一步,我们的数据库是已经可以连接成功了的。那接下来我们就要做一些逻辑处理了
增加Promise方法(所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。通常传入两个参数resolve,reject)
Promise对象有以下两个特点。
(1)对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成,又称 Fulfilled)和Rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。
(2)一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从Pending变为Resolved和从Pending变为Rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。就算改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。
有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供统一的接口,使得控制异步操作更加容易。
exports.connect = ()=>{
//连接数据库
mongoose.connect(db)
let maxConnectTimes = 0
return new Promise((resolve,reject)=>{
//增加数据库监听事件
mongoose.connection.on('disconnected',()=>{
console.log('***********数据库断开***********')
if(maxConnectTimes<=3){ //当断开连接的时候,让他尝试重连三次
maxConnectTimes++ //每次+1
mongoose.connect(db)
}else{ //重新连接三次后还是没有连接上,我们就抛出异常
reject() // 用reject() 返回给promise
throw new Error('数据库出现问题,请及时处理.....')
}
})
mongoose.connection.on('error',(err)=>{
console.log('***********数据库错误')
if(maxConnectTimes<=3){
maxConnectTimes++
mongoose.connect(db)
}else{
reject(err)
throw new Error('数据库出现问题,请及时处理.....')
}
})
//链接打开的时
mongoose.connection.once('open',()=>{
console.log('MongoDB connected successfully')
resolve()
})
})
}
好了 我们的数据库连接和逻辑构造差不多就这样了好了,我们这套实战呢会用到很多ES6的语法只是,用的时候我会尽量的给补充完整的
三人行,必有我师