在MongoDB中使用本地ES6承诺
我知道Mongo的Node驱动程序可以使用外部库进行promisified 。 我很好奇,看看ES6承诺可以用于MongoClient.connect
,所以我尝试了这个(使用Babel 5.8.23 transpile):
import MongoClient from 'mongodb'; function DbConnection({ host = 'localhost', port = 27017, database = 'foo' }) { return new Promise((resolve, reject) => { MongoClient.connect(`mongodb://${host}:${port}/${database}`, (err, db) => { err ? reject(err) : resolve(db); }); }); } DbConnection({}).then( db => { let cursor = db.collection('bar').find(); console.log(cursor.count()); }, err => { console.log(err); } );
输出是{Promise <pending>}
。 任何与游标有关的事情似乎都会产生类似的结果。 有没有办法来解决这个问题,还是我完全错误地吠叫了错误的树?
编辑:节点版本4.1.0。
没有什么可以解决的,这是预期的行为。 cursor.count()
返回一个promise,如果你想要的值,你需要使用.then
,例如
DbConnection({}).then( db => { let cursor = db.collection('bar').find(); return cursor.count(); } }).then( count => { console.log(count); }, err => { console.log(err); } );
或简化
DbConnection({}).then(db => db.collection('bar').find().count()).then( count => console.log(count), err => console.log(err) );
loganfsmyth响应的另一个语法(顺便说一下,谢谢)
cursor.count().then(function(cursor_count){ if(cursor_count){ // use cursor }else{ // no results } }