如何使用Node.js中的承诺MongoDB?

我一直在试图发现如何在Node.js中使用MongoDB,在文档中,似乎build议使用callback。 现在,我知道这只是一个偏好问题,但我更喜欢使用承诺。

问题是我没有find如何使用它们与MongoDB。 事实上,我已经尝试了以下内容:

var MongoClient = require('mongodb').MongoClient; var url = 'mongodb://localhost:27017/example'; MongoClient.connect(url).then(function (err, db) { console.log(db); }); 

结果是undefined 。 在这种情况下,似乎并不是这样做的。

有没有办法使用mongo数据库内的节点与承诺,而不是callback?

       

网上收集的解决方案 "如何使用Node.js中的承诺MongoDB?"

你的方法几乎是正确的,在你的论点中只是一个小小的错误

 var MongoClient = require('mongodb').MongoClient var url = 'mongodb://localhost:27017/example' MongoClient.connect(url) .then(function (db) { // <- db as first argument console.log(db) }) .catch(function (err) {}) 

既然上面的答案都没有提到如果没有蓝鸟或q或任何其他花哨的图书馆如何做到这一点,让我加我2分这一点。

以下是如何使用本地ES6承诺进行插入

  'use strict'; const constants = require('../core/constants'), mongoClient = require('mongodb').MongoClient; function open(){ // Connection URL. This is where your mongodb server is running. let url = constants.MONGODB_URI; return new Promise((resolve, reject)=>{ // Use connect method to connect to the Server mongoClient.connect(url, (err, db) => { if (err) { reject(err); } else { resolve(db); } }); }); } function close(db){ //Close connection if(db){ db.close(); } } let db = { open : open, close: close } module.exports = db; 

我将open()方法定义为返回承诺的方法。 要执行一个插入,下面是我的代码片段

 function insert(object){ let database = null; zenodb.open() .then((db)=>{ database = db; return db.collection('users') }) .then((users)=>{ return users.insert(object) }) .then((result)=>{ console.log(result); database.close(); }) .catch((err)=>{ console.error(err) }) } insert({name: 'Gary Oblanka', age: 22}); 

希望有所帮助。 如果你有任何build议,使这个更好,让我知道,因为我愿意改善自己:)

你可以使用一个替代的软件包,例如mongodb-promise ,或者通过在它周围build立自己的承诺或者通过一个promise工具包(比如bluebird.promisify

它看起来不像连接方法有一个承诺接口定义

http://mongodb.github.io/node-mongodb-native/2.1/tutorials/connect/

你可以在Mongodb连接库中自己实现它,但是这可能比你想要的要复杂得多。

如果您确实需要使用承诺,则始终可以使用ES6承诺填充:

https://github.com/stefanpenner/es6-promise

并包装你的连接代码。 就像是

 var MongoClient = require('mongodb').MongoClient; var Promise = require('es6-promise').Promise; var url = 'mongodb://localhost:27017/example'; var promise = new Promise(function(resolve, reject){ MongoClient.connect(url, function (err, db) { if(err) reject(err); resolve(db); }); }); promise.then(<resolution code>); 

您需要创build一个连接到Mongo的承诺。

然后,定义使用此承诺的函数: myPromise.then(...)

例如:

 function getFromMongo(cb) { connectingDb.then(function(db) { db.collection(coll).find().toArray(function (err,result){ cb(result); }); }); } 

这里是完整的代码:

http://jsfiddle.net/t5hdjejg/

如果您select使用蓝鸟作为承诺库,则可以在MongoClient上使用蓝鸟promisifyAll()函数:

 var Promise = require('bluebird'); var MongoClient = Promise.promisifyAll(require('mongodb').MongoClient); var url = 'mongodb://localhost:27017/example'; MongoClient.connectAsync(url).then(function (db) { console.log(db); }).catch(function(err){ //handle error console.log(err); }); 

编辑:正如John Culviner指出的,这个答案已经被弃用了。 使用驱动程序,它带有承诺OOTB。