因此,围绕此主题还有一些其他查询,例如: 如何使用bluebird宣传MongoDB本机Javascript驱动程序?
但它似乎没有解决最新版本的驱动程序,这似乎在尝试promisify时有问题.目前我可以通过以下方式MongoClient开展工作:
Promise.promisifyAll(mongodb.MongoClient); // Using .Prototype here fails to promisify
然而,无论我尝试什么收集似乎没有使用*async调用操作,它可能会调用它们,但它们永远不会被解决或拒绝,所以他们只是陷入困境.
历史上在以前的版本中你只会Promise.promisifyAll(mongodb)和你完成,但我不确定如何在新的驱动程序中正确处理它.
以下是使用mongo direct promisification创建的集合的示例输出,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: …
我正在尝试启动MEAN堆栈服务器,但是我收到此错误信息:
Mongoose:不推荐使用mpromise(mongoose的默认承诺库),而是插入自己的promise库:http://mongoosejs.com/docs/promises.html
我试着在这里搜索一些答案,但我找到的答案对我来说不够清楚:
我找到了调用mongoose.connect的文件,但该问题的代码对我不起作用,有人能解释一下它是如何工作的吗?
这个问题的答案是否仍然相关:如何使用bluebird宣传MongoDB本机Javascript驱动程序?
我不知道从什么时候开始更新,但是MongoDB的2.0 JS驱动程序在options对象中有一个属性promiseLibrary:http://mongodb.github.io/node-mongodb-native/2.0/api/MongoClient.html
并且大多数方法/函数确实返回了一个承诺,例如Cursor.toArray().
但是,我找不到使用这个新选项的示例,但使用时不会更简单:
MongoClient.connect('mongodb://URL', { promiseLibrary: require('bluebird') });
Run Code Online (Sandbox Code Playgroud)
或者这个定义是错的? - 在哪种情况下,应该如何正确定义?
更新:
代码在io.js上运行,所以我甚至可能不需要指定一个promiseLibrary驱动程序将使用ES6承诺? - 但是,据说蓝鸟的承诺比较慢:
Update2: 我添加了bluebird标签 - 如果promisifying真的比使用MongoDB自己的实现更好的话,也许在bluebird上工作的人可以提供更多细节吗?
我知道可以使用外部库来宣传 Mongo的Node驱动程序.我很想知道是否可以使用ES6承诺MongoClient.connect,所以我尝试了这个(使用Babel 5.8.23进行转换):
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);
}
);
Run Code Online (Sandbox Code Playgroud)
输出是{Promise <pending>}.与游标有关的任何事情似乎都会产生类似的结果.有没有办法解决这个问题,还是我完全咆哮错误的树?
编辑:节点版本4.1.0.
我刚开始尝试在我的Node.js应用程序上实现Promises.现在我正在检查用户和密码是否存在,然后使用mongodb查找它们如果找不到用户它设置了promise.reject()但是它过早地返回了promise并且它仍处于挂起状态.如果有人可以帮助或给我关于如何重构的想法,将不胜感激.
mongodb ×5
node.js ×5
promise ×4
javascript ×3
bluebird ×2
babeljs ×1
es6-promise ×1
mongoose ×1