Vue+Koa2移动电商实战 (九)mongoose连接数据库

前面我们已经做完了环境的部署和基本的测试,现在我们要开始使用我们的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的语法只是,用的时候我会尽量的给补充完整的

原文地址:https://www.cnblogs.com/yang656/p/10040763.html