zoukankan      html  css  js  c++  java
  • 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的语法只是,用的时候我会尽量的给补充完整的

  • 相关阅读:
    浅谈工业无线技术之天线
    防护等级
    PROFINET如何实现实时性
    2020,我又回来了
    关于ReentrantLock和Condition的用法
    当你在试衣间试衣服,请你务必想起wait()与notify()
    用生活例子来解释Java synchronized块
    关于textview显示特殊符号居中的问题
    扯一扯我的2016
    国庆的这6天
  • 原文地址:https://www.cnblogs.com/yang656/p/10040763.html
Copyright © 2011-2022 走看看