在使用 Bluebird 承诺 mongodb 后,使用 mongodb 的查找游标的 next/each 函数作为承诺的方法

Way to use mongodb's find cursor's next/each functions as a promise after promisifying mongodb with Bluebird

这是我的代码示例:

var findAsync = function (collection,query) {
    return mongodb.MongoClient.connectAsync(mongodbServerString)
    .then(function (db) {
        return [db.collection(collection).find(query), db];
    });
};

findAsync("UserProfile",{})
.spread(function (cursor,db) {
    return [cursor.project({Email:true}),db];
})
.spread(function (cursor, db) {
    return cursor.eachAsync().then(function (doc) {
        console.log(doc);
    }).catch(function () {
        db.close();
    });
});

承诺代表奇异值。 Promise 基本上类似于函数 returns,因为一个函数不能 return 多个值——将 each 转换为一个 promise returning 函数是没有意义的。

你可以做的是将其转换为 Observable returning 函数,然后在其上使用 .forEach 以获得完成序列的承诺,或者你可以手动实现类似的东西:

function each(cursor, fn) {
    return new Promise((resolve, reject) => {
        cursor.forEach((err, data) => {
           if(err) {
             cursor.close();
             return reject(err);
           }
           try { fn(data); } catch(e) { cursor.close(); reject(e); }
        }, err => { { // finished callback
           if(err) reject(err);
           else resolve();
        });
    });
}

哪个会让你写:

each(cursor, doc => console.log(doc)).then(...).catch(...)

另请注意,Mongo 连接是持久的,您应该在服务器启动时连接一次,然后在服务器 运行.[=16 期间一直保持连接打开状态=]