在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主题