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

前面咱们已经作完了环境的部署和基本的测试,如今咱们要开始使用咱们的mongoose来链接咱们的数据库,作到先后端分离这样一个操做,也就是常常说的mvc(model view controller),在model和controller之间常常须要一些工具来进行对接,帮助完成数据库的操做和通信mongodb

什么是mongoose呢:Mongoose是一个开源封装好的实现Node和Mongodb数据通信的数据建模库数据库


第一步,安装咱们的mongoosenpm

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 里面加入当即执行函数,在使用前要加入connectpromise

const { connect } = require('./database/init.js')

  而后添加当即执行函数mvc

//当即执行函数
(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的语法只是,用的时候我会尽可能的给补充完整的async

相关文章
相关标签/搜索