前面我们已经做完了环境的部署和基本的测试,现在我们要开始使用我们的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对象提供统一的接口,使得控制异步操作更加容易。
(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的语法只是,用的时候我会尽量的给补充完整的