发帖  主题  评论  推荐  标签 用户 查搜   用户 密码 自动 注册  
 
面向对象 设计模式 领域驱动设计 企业架构 框架 开发教程 微服务 大数据 扩展性 并发编程 事件驱动 分布式 CQRS

在Node.js 4中使用ES6连接MongoDB

  Javascript 6/ES6逐渐普遍以及Node.js 4.0版本的发布,我们可能需要使用全新方式编写Node.js代码,使用ES6中异步Promise对数据库进行异步连接,这里以MongoDB为案例。

'use strict'

const MongoClient = require('mongodb')

class Database {
   constructor (uri) {
    this.uri = uri
    this.db = {}
    return this
  }

   connect () {
    return new Promise((resolve, reject) => {
      MongoClient.connect(this.uri, (err, db) => {
        if (err) reject(err)
        this.db = db
        resolve(this)
      })
    })
  }

   addReport (domain) {
    return new Promise((resolve, reject) => {
      this.db.collection('domains').findAndModify(
        { domain: domain }
        , {}
        , { $inc: { reported: 1 } }
        , { new: true, upsert: true }
        , (err, data) => {
          if (err) reject(err)
            resolve(data)
          })
    })

  }

   findReport (domain) {
    return new Promise((resolve, reject) => {
      this.db.collection('domains').findOne(
        { domain: domain }
        , { _id: false, reported: true }
        , (err, data) => {
            if (err) reject(err)
              if (data) {
                resolve(data.reported)
              } else {
                resolve(0)
              }
        })
      })
    }
}

module.exports = Database

下面是对上述数据库操作测试的代码:

 

 

'use strict'

 

const Database = require('../database')

 

    , dbUrl = process.env.MONGODB_URI || 'mongodb://localhost:27017/test'

 

    , assert = require('assert')

 

 

 

describe('Database', () => {

 

  let database

 

 

 

  beforeEach((done) => {

 

    database = new Database(dbUrl)

 

    database.connect()

 

      .then(() => { done() })

 

      .catch((err) => { done(err) })

 

  })

 

 

 

  afterEach(() => {

 

    database.db.dropDatabase()

 

  })

 

 

 

  it('should add a domain to the database with one report', (done) => {

 

    database.addReport('google.com')

 

      .then((data) => {

 

        assert.equal(data.value.domain, 'google.com', 'domain not inserted')

 

        return database.findReport('google.com')

 

      })

 

      .then((data) => {

 

        assert.equal(data, 1, 'incorrect number of reports')

 

        done()

 

      })

 

      .catch((err) => {

 

        done(err)

 

      })

 

  })

 

})

 

Node.js主题

 

解道移动版 | 关注解道 | 联系解道 | 关于解道 | 广告联系 | 网站地图 | 设为首页

沪ICP证12033263 如有意见请与我们联系 Powered by JdonFramework
返回顶部