具有Bluebird 2.9.*的Mongodb节点驱动程序2.0.* [英] Mongodb node driver 2.0.* with Bluebird 2.9.* promisification
问题描述
因此,围绕该主题还有其他一些查询,例如: 如何使用蓝鸟?
但是,它似乎没有解决驱动程序的最新版本,该驱动程序在尝试进行承诺时似乎存在问题.目前,我可以通过执行以下操作来使MongoClient
工作:
Promise.promisifyAll(mongodb.MongoClient); // Using .Prototype here fails to promisify
但是,无论我尝试什么,Collection似乎都不能使用*async
调用来操作,它可能会调用它们,但它们永远不会被解决或拒绝,因此它们陷入了困境.
从历史上看,以前的版本只是Promise.promisifyAll(mongodb)
而已完成,但是我不确定如何在新驱动程序中正确处理此问题.
这是使用mongo直接承诺connectAsync
创建的集合的示例输出,然后从返回的db获取集合.一旦我尝试对集合执行任何操作,它就会挂起并且承诺不会从中返回:
{ s:
{ pkFactory:
{ [Function: ObjectID]
index: 14727641,
createPk: [Function: createPk],
createFromTime: [Function: createFromTime],
createFromHexString: [Function: createFromHexString],
isValid: [Function: isValid],
ObjectID: [Circular],
ObjectId: [Circular],
createPkAsync: [Object],
createFromTimeAsync: [Object],
createFromHexStringAsync: [Object],
isValidAsync: [Object],
bindAsync: [Object],
toStringAsync: [Object],
callAsync: [Object],
applyAsync: [Object],
lazyAsync: [Object],
throttleAsync: [Object],
debounceAsync: [Object],
delayAsync: [Object],
everyAsync: [Object],
cancelAsync: [Object],
afterAsync: [Object],
onceAsync: [Object],
fillAsync: [Object] },
db:
{ domain: [Object],
_events: {},
_maxListeners: undefined,
s: [Object],
serverConfig: [Getter],
bufferMaxEntries: [Getter],
databaseName: [Getter],
options: [Getter],
native_parser: [Getter],
slaveOk: [Getter],
writeConcern: [Getter] },
topology:
{ domain: [Object],
_events: [Object],
_maxListeners: undefined,
connectTimeoutMS: 500,
s: [Object],
bson: [Getter],
isMasterDoc: [Getter],
poolSize: [Getter],
autoReconnect: [Getter],
host: [Getter],
port: [Getter],
emitOpen: false,
socketTimeoutMS: 0 },
dbName: 'some-db-name',
options: {},
namespace: 'some-namespace',
readPreference: null,
raw: undefined,
slaveOk: false,
serializeFunctions: undefined,
internalHint: null,
collectionHint: null,
name: 'some-collection-name' } }
您可以在要求后直接对其进行承诺,如 使用bluebird 2.9.14和mongodb驱动程序2.0.22,我得到了以下结果(简化): 并成功查询如下: 更新 使用 So there are a few other queries around this subject such as:
How can I promisify the MongoDB native Javascript driver using bluebird? However it does not seem to address the latest version of the driver, which seems to have issues when trying to promisify. Currently I can get the However no matter what I try the Collections do not seem to operate using the Historically in the previous versions you would just Here is an example output of a collection which has been created using the mongo direct promisification You can promisify it directly after requiring, as exemplified on bluebird API docs, like this: Using bluebird 2.9.14 and mongodb driver 2.0.22, I got this (simplified) results: And queried successfully like this: UPDATE Using the
这篇关于具有Bluebird 2.9.*的Mongodb节点驱动程序2.0.*的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋! // ....
Collection:
{ [Function]
[length]: 6,
[name]: '',
[arguments]: [Getter/Setter],
[caller]: [Getter/Setter],
[prototype]:
{ [constructor]: [Circular],
collectionName: [Getter],
// ....
findAsync: [Object],
insertOneAsync: [Object],
insertManyAsync: [Object],
bulkWriteAsync: [Object],
insertAsync: [Object],
updateOneAsync: [Object],
replaceOneAsync: [Object],
updateManyAsync: [Object],
updateAsync: [Object],
deleteOneAsync: [Object],
removeOneAsync: [Object],
deleteManyAsync: [Object],
removeManyAsync: [Object],
removeAsync: [Object],
saveAsync: [Object],
findOneAsync: [Object],
// ....
MongoDB.connectAsync('mongodb://localhost:27017/test').then(function(db) {
return db.collection("orders").findOneAsync({});
}).then(function(orders) {
console.log(orders);
}).catch(function(err) {
console.log(err);
});
MongoClient
对象也可以:var Promise = require("bluebird");
var MongoDB = Promise.promisifyAll(require("mongodb"));
var MongoClient = Promise.promisifyAll(MongoDB.MongoClient);
MongoClient.connectAsync('mongodb://localhost:27017/test').then(function(db) {
return db.collection("orders").find({}).toArrayAsync();
}).then(function(orders) {
console.log(orders)
}).catch(function(err) {
console.log(err);
});
MongoClient
working by doing:Promise.promisifyAll(mongodb.MongoClient); // Using .Prototype here fails to promisify
*async
calls, it may invoke them but they never get resolved or rejected so they just hang in limbo.Promise.promisifyAll(mongodb)
and you were done, but I am unsure as to how to correctly handle this in the new driver.connectAsync
then getting the collection from the returned db. Once I try to do anything on the collection it just hangs and promises dont return from it:
{ s:
{ pkFactory:
{ [Function: ObjectID]
index: 14727641,
createPk: [Function: createPk],
createFromTime: [Function: createFromTime],
createFromHexString: [Function: createFromHexString],
isValid: [Function: isValid],
ObjectID: [Circular],
ObjectId: [Circular],
createPkAsync: [Object],
createFromTimeAsync: [Object],
createFromHexStringAsync: [Object],
isValidAsync: [Object],
bindAsync: [Object],
toStringAsync: [Object],
callAsync: [Object],
applyAsync: [Object],
lazyAsync: [Object],
throttleAsync: [Object],
debounceAsync: [Object],
delayAsync: [Object],
everyAsync: [Object],
cancelAsync: [Object],
afterAsync: [Object],
onceAsync: [Object],
fillAsync: [Object] },
db:
{ domain: [Object],
_events: {},
_maxListeners: undefined,
s: [Object],
serverConfig: [Getter],
bufferMaxEntries: [Getter],
databaseName: [Getter],
options: [Getter],
native_parser: [Getter],
slaveOk: [Getter],
writeConcern: [Getter] },
topology:
{ domain: [Object],
_events: [Object],
_maxListeners: undefined,
connectTimeoutMS: 500,
s: [Object],
bson: [Getter],
isMasterDoc: [Getter],
poolSize: [Getter],
autoReconnect: [Getter],
host: [Getter],
port: [Getter],
emitOpen: false,
socketTimeoutMS: 0 },
dbName: 'some-db-name',
options: {},
namespace: 'some-namespace',
readPreference: null,
raw: undefined,
slaveOk: false,
serializeFunctions: undefined,
internalHint: null,
collectionHint: null,
name: 'some-collection-name' } }
var Promise = require("bluebird");
var MongoDB = Promise.promisifyAll(require("mongodb"));
var util = require('util');
console.log(util.inspect(MongoDB, { showHidden: true }));
// ....
Collection:
{ [Function]
[length]: 6,
[name]: '',
[arguments]: [Getter/Setter],
[caller]: [Getter/Setter],
[prototype]:
{ [constructor]: [Circular],
collectionName: [Getter],
// ....
findAsync: [Object],
insertOneAsync: [Object],
insertManyAsync: [Object],
bulkWriteAsync: [Object],
insertAsync: [Object],
updateOneAsync: [Object],
replaceOneAsync: [Object],
updateManyAsync: [Object],
updateAsync: [Object],
deleteOneAsync: [Object],
removeOneAsync: [Object],
deleteManyAsync: [Object],
removeManyAsync: [Object],
removeAsync: [Object],
saveAsync: [Object],
findOneAsync: [Object],
// ....
MongoDB.connectAsync('mongodb://localhost:27017/test').then(function(db) {
return db.collection("orders").findOneAsync({});
}).then(function(orders) {
console.log(orders);
}).catch(function(err) {
console.log(err);
});
MongoClient
object works as well:var Promise = require("bluebird");
var MongoDB = Promise.promisifyAll(require("mongodb"));
var MongoClient = Promise.promisifyAll(MongoDB.MongoClient);
MongoClient.connectAsync('mongodb://localhost:27017/test').then(function(db) {
return db.collection("orders").find({}).toArrayAsync();
}).then(function(orders) {
console.log(orders)
}).catch(function(err) {
console.log(err);
});