在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)
})
})
})