如何使用bluebird推荐MongoDB本机Javascript驱动程序?

如何使用bluebird推荐MongoDB本机Javascript驱动程序?,javascript,mongodb,promise,bluebird,node-mongodb-native,Javascript,Mongodb,Promise,Bluebird,Node Mongodb Native,我想用这个。如何在此库上使用?当使用promisifyAll()时,如果必须实例化目标对象,则有助于识别目标原型。对于MongoDB JS驱动程序,标准模式是: 使用MongoClient静态方法或Db构造函数获取Db对象 调用Db#collection()以获取collection对象 因此,借用,您可以: var Promise = require('bluebird'); var mongodb = require('mongodb'); var MongoClient = mongo

我想用这个。如何在此库上使用?

当使用
promisifyAll()
时,如果必须实例化目标对象,则有助于识别目标原型。对于MongoDB JS驱动程序,标准模式是:

  • 使用
    MongoClient
    静态方法或
    Db
    构造函数获取
    Db
    对象
  • 调用
    Db#collection()
    以获取
    collection
    对象
因此,借用,您可以:

var Promise = require('bluebird');
var mongodb = require('mongodb');
var MongoClient = mongodb.MongoClient;
var Collection = mongodb.Collection;

Promise.promisifyAll(Collection.prototype);
Promise.promisifyAll(MongoClient);
现在您可以:

var client = MongoClient.connectAsync('mongodb://localhost:27017/test')
    .then(function(db) {
        return db.collection("myCollection").findOneAsync({ id: 'someId' })
    })
    .then(function(item) {
      // Use `item`
    })
    .catch(function(err) {
        // An error occurred
    });
这会让您走得更远,但它也有助于确保
集合#find()
返回的
游标
对象也得到验证。在MongoDB JS驱动程序中,
Collection#find()
返回的游标不是从原型生成的。因此,每次都可以包装该方法并提示光标。如果您不使用游标,或者不想产生开销,那么这是不必要的。这里有一种方法:

Collection.prototype._find = Collection.prototype.find;
Collection.prototype.find = function() {
    var cursor = this._find.apply(this, arguments);
    cursor.toArrayAsync = Promise.promisify(cursor.toArray, cursor);
    cursor.countAsync = Promise.promisify(cursor.count, cursor);
    return cursor;
}

2.0分支文档包含更好的Promission指南

它实际上有一个更简单的mongodb示例:

var Promise = require("bluebird");
var MongoDB = require("mongodb");
Promise.promisifyAll(MongoDB);

mongodb
的1.4.9版现在应该很容易实现:

Promise.promisifyAll(mongo.Cursor.prototype);

有关更多详细信息,请参阅。

我知道这个问题已经回答了好几次,但我想补充一些关于这个主题的信息。根据Bluebird自己的文档,您应该使用“使用”来清理连接并防止内存泄漏。

我到处寻找如何正确地做到这一点,但信息很少,所以我想我会分享我在反复尝试后发现的东西。下面我使用的数据(餐厅)来自MongoDB示例数据。你可以在这里得到:

//使用dotenv获取环境/连接信息
require('dotenv').load();
var Promise=require('bluebird'),
mongodb=Promise.promisifyAll(require('mongodb'))
使用=承诺;使用;
函数getConnectionAsync(){
//process.env.MongoDbUrl使用上面的命令存储在my.env文件中
返回mongodb.MongoClient.connectAsync(process.env.MongoDbUrl)
//.disposer是处理清理连接的程序
.处理器(功能(连接){
connection.close();
});
}
//下面的两种方法检索相同的数据并输出相同的数据
//但不同的是,第一个异步执行尽可能多的操作
//而第二个则使用了每一个的阻塞版本
//注意:使用limitAsync似乎永远不会登陆,也永远不会回来!
//这里的一切都是异步完成的
使用(
getConnectionAsync(),
功能(连接){
//因为我们使用了promisifyAll(),所以
//promisified中的方法现在有一个异步同级
//集合:CollectionSync
//查找:findAsync
//等等。
返回连接。collectionAsync('餐厅')
.然后(函数(集合){
返回集合。findAsync()
})
.then(功能(数据){
返回data.limit(10).toArrayAsync();
});
}
//在调用“.then”之前,using语句现在将调用
//.dispose()是在getConnectionAsync方法中设置的
).那么(
功能(数据){
console.log(“结束数据”,数据);
}
);
//这里,只有连接是异步的,其余的是阻塞进程
使用(
getConnectionAsync(),
功能(连接){
//这里因为我没有使用任何异步函数,所以应该
//与上面承诺的版本不同,所有这些都可能阻止请求
返回连接.collection('restaurants').find().limit(10.toArray();
}
).那么(
功能(数据){
console.log(“结束数据”,数据);
}
);

我希望这能帮助其他想按《蓝鸟》一书做事的人。

我们已经在生产中使用了以下驱动程序一段时间了。它本质上是原生node.js驱动程序上的承诺包装器。它还添加了一些附加的辅助函数


poseidon mongo
-

调用promisify on cursor.toArray很昂贵,如果你每次都这样做,promisify
cursor.prototype
怎么样?还有,“现在你可以”部分中的
Async
前缀你没有遗漏吗?@BenjaminGruenbaum:是的,在我关闭选项卡后意识到我伪造了-
Async
。刚刚解决了这个问题。从参考答案中得到的印象是光标不是从原型构建的。现在就开始测试。另外,你可能希望promisify MongoClient.prototype而不是MongoClient。你知道,这不是魔术:)@dimadima你需要promisify
Cursor.prototype
(上面的代码不这样做)不
Cursor
,因为;您可以看到返回的游标不是从
游标构建的。prototype
@dimadima我明白了,为每个游标一次又一次地创建方法是非常低效的:/n这不就是
var MongoDB=Promise.promisifyAll(require(“MongoDB”)
现在吗?正确,现在您只需要promisify
require(“MongoDB”)
。例如,所有游标都必须使用ArrayaSync方法。mongo 2.0以后的版本允许您告诉mongo驱动程序您想要使用bluebird:在我看来,这是最好的解决方案,您最好将其作为答案而不是评论。