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