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

相關文章
相關標籤/搜索