2015-09-25 18 views
6

Tôi biết rằng trình điều khiển Nút cho Mongo có thể là promisified sử dụng các thư viện bên ngoài. Tôi đã tò mò muốn xem những lời hứa ES6 có thể được sử dụng với MongoClient.connect, vì vậy tôi cố gắng này (sử dụng Babel 5.8.23 để transpile):Sử dụng các lời hứa ES6 gốc với 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); 
    } 
); 

Đầu ra là {Promise <pending>}. Bất cứ điều gì để làm với con trỏ dường như mang lại một kết quả tương tự. Có cách nào để có được xung quanh này hay tôi sủa cây sai hoàn toàn?

Chỉnh sửa: phiên bản nút 4.1.0.

Trả lời

10

Không có gì để đi lại, đây là hành vi mong đợi. cursor.count() trả về lời hứa, nếu bạn muốn giá trị, bạn cần sử dụng .then, ví dụ:

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

hoặc đơn giản

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

Tốt đau buồn. Cảm ơn, dường như tôi đã nhìn chằm chằm vào nó quá lâu! –

+1

Tất cả chúng ta đều có thời gian :) – loganfsmyth

+2

IME, không cần 'err => {console.log (err}' - chỉ cần đặt 'console.log' trong tham số lỗi' .then' – Alnitak

0

Một cú pháp cho các phản ứng của loganfsmyth (nhờ bằng cách này)

cursor.count().then(function(cursor_count){ 
    if(cursor_count){ 
    // use cursor 
    }else{ 
    // no results 
    } 
} 
Các vấn đề liên quan