2015-09-25 11 views
6

Jestem świadomy, że sterownik Node dla Mongo może być promisified przy użyciu zewnętrznych bibliotek. Byłem ciekaw, czy ES6 obietnice mogą być wykorzystane z MongoClient.connect, więc próbowałem to (przy użyciu Babel 5.8.23 do transpile):Używanie natywnych obietnic ES6 z 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); 
    } 
); 

Wyjście jest {Promise <pending>}. Coś związanego z kursorami wydaje się dawać podobny rezultat. Czy istnieje sposób na obejście tego problemu lub czy szczerzę zupełnie niewłaściwe drzewo?

Edytuj: wersja węzła 4.1.0.

Odpowiedz

10

Nie ma nic do obejścia, to jest oczekiwane zachowanie. cursor.count() zwraca obietnicę, jeśli chcesz uzyskać wartość, musisz użyć .then, np.

DbConnection({}).then(
db => { 
    let cursor = db.collection('bar').find(); 
    return cursor.count(); 
    } 
}).then(
    count => { 
    console.log(count); 
    }, 
    err => { 
    console.log(err); 
    } 
); 

lub uproszczone

DbConnection({}).then(db => db.collection('bar').find().count()).then(
    count => console.log(count), 
    err => console.log(err) 
); 
+0

Dobry Boże. Dzięki, najwyraźniej długo wpatrywałem się w to! –

+1

Wszyscy mamy te czasy :) – loganfsmyth

+2

IME, nie ma potrzeby "err => {console.log (err)' - wystarczy wpisać 'console.log' w parametrze błędu' .then' – Alnitak

0

Kolejna składnia odpowiedzi loganfsmyth (dzięki drodze)

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