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