2015-09-25 37 views
6

使用本机ES6承诺我知道,对于蒙戈节点驱动程序可以使用外部库是promisified。我很好奇,看看是否ES6承诺可以与MongoClient.connect使用,所以我想这(使用巴贝尔23年5月8日至transpile):用MongoDB的

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。

回答

10

没有什么可以解决的,这是预期的行为。 cursor.count()返回承诺,如果您需要该值,则需要使用.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) 
); 
+0

良好的悲伤。谢谢,显然我一直在盯着它太久了! –

+1

我们都有这些时间:) – loganfsmyth

+2

IME,不需要'err => {console.log(err}' - 只需将'console.log'放入'.then'错误参数 – Alnitak

0

另一个语法loganfsmyth的响应(感谢的方式)

cursor.count().then(function(cursor_count){ 
    if(cursor_count){ 
    // use cursor 
    }else{ 
    // no results 
    } 
}