我一直在尝试发现如何将MongoDB与Node.js一起使用,而在文档中,似乎建议的方法是使用回调。现在,我知道这只是一个偏好问题,但我更喜欢使用承诺。
问题是我没有找到如何在MongoDB中使用它们。的确,我尝试了以下内容:
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/example';
MongoClient.connect(url).then(function (err, db) {
console.log(db);
});
结果是undefined
。在这种情况下,这似乎不是这样做的方式。
有没有办法在Node中使用mongo db而不是回调?
答案 0 :(得分:93)
你的方法几乎是正确的,只是你论证中的一个小错误
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) {})
答案 1 :(得分:17)
由于上面的答案都没有提到如何在没有蓝鸟或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()方法定义为返回promise的方法。要执行插入,请参阅下面的代码片段
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});
希望有所帮助。如果您有任何改善建议,请告诉我,因为我愿意提高自己:)
答案 2 :(得分:7)
这是如何在Node.js中使用MongoDB的一般答案?
如果省略回调参数,mongodb将返回一个promise
转换为承诺之前
var MongoClient = require('mongodb').MongoClient,
dbUrl = 'mongodb://db1.example.net:27017';
MongoClient.connect(dbUrl,function (err, db) {
if (err) throw err
else{
db.collection("users").findOne({},function(err, data) {
console.log(data)
});
}
})
转换为Promise后
//converted
MongoClient.connect(dbUrl).then(function (db) {
//converted
db.collection("users").findOne({}).then(function(data) {
console.log(data)
}).catch(function (err) {//failure callback
console.log(err)
});
}).catch(function (err) {})
如果你需要处理多个请求
MongoClient.connect(dbUrl).then(function (db) {
/*---------------------------------------------------------------*/
var allDbRequest = [];
allDbRequest.push(db.collection("users").findOne({}));
allDbRequest.push(db.collection("location").findOne({}));
Promise.all(allDbRequest).then(function (results) {
console.log(results);//result will be array which contains each promise response
}).catch(function (err) {
console.log(err)//failure callback(if any one request got rejected)
});
/*---------------------------------------------------------------*/
}).catch(function (err) {})
答案 3 :(得分:2)
警告编辑:
John Culviner指出,这个答案已被弃用。使用驱动程序,它附带承诺OOTB。
如果您选择将bluebird用作promise库,则可以在MongoClient上使用bluebirds 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);
});
答案 4 :(得分:2)
您还可以执行 async / await
async function main(){
let client, db;
try{
client = await MongoClient.connect(mongoUrl, {useNewUrlParser: true});
db = client.db(dbName);
let dCollection = db.collection('collectionName');
let result = await dCollection.find();
// let result = await dCollection.countDocuments();
// your other codes ....
return result.toArray();
}
catch(err){ console.error(err); } // catch any mongo error here
finally{ client.close(); } // make sure to close your connection after
}
答案 5 :(得分:2)
我知道我参加聚会有点晚了,但是我想分享一个使用ES6的例子
const config = require('config');
const MongoClient = require('mongodb').MongoClient;
var _connection;
var _db;
const closeConnection = () => {
_connection.close();
}
/**
* Connects to mongodb using config/config.js
* @returns Promise<Db> mongo Db instance
*/
const getDbConnection = async () => {
if (_db) {
return _db;
}
console.log('trying to connect');
const mongoClient = new MongoClient(config.mongodb.url, { useNewUrlParser: true });
_connection = await mongoClient.connect();
_db = _connection.db(config.mongodb.databaseName);
return _db;
}
module.exports = { getDbConnection, closeConnection };
如果您想看一眼,我会在这里做更详细的介绍:
https://medium.com/swlh/how-to-connect-to-mongodb-using-a-promise-on-node-js-59dd6c4d44a7
答案 6 :(得分:1)
使用MongoDB 版本> 3.0
的工作解决方案var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
open = (url) => {
return new Promise((resolve,reject) => {
MongoClient.connect(url, (err,client) => { //Use "client" insted of "db" in the new MongoDB version
if (err) {
reject(err)
} else {
resolve({
client
});
};
});
});
};
create = (client) => {
return new Promise((resolve,reject) => {
db = client.db("myFirstCollection"); //Get the "db" variable from "client"
db.collection("myFirstCollection").insertOne({
name: 'firstObjectName',
location: 'London'
}, (err,result)=> {
if(err){reject(err)}
else {
resolve({
id: result.ops[0]._id, //Add more variables if you want
client
});
}
});
});
};
close = (client) => {
return new Promise((resolve,reject) => {
resolve(client.close());
})
};
open(url)
.then((c) => {
clientvar = c.client;
return create(clientvar)
}).then((i) => {
idvar= i.id;
console.log('New Object ID:',idvar) // Print the ID of the newly created object
cvar = i.client
return close(cvar)
}).catch((err) => {
console.log(err)
})
答案 7 :(得分:1)
这是基于 @pirateApp's 的回答。
const open = (dbName, collectionName) => {
const URI = process.env.MONGO_URI;
return new Promise((resolve, reject) => {
let savedConn = null;
MongoClient.connect(URI, {
useNewUrlParser: true,
useUnifiedTopology: true,
})
.then((conn) => {
savedConn = conn;
return conn.db(dbName).collection(collectionName);
})
.then((db) => {
resolve({ db, savedConn });
})
.catch((err) => reject(err));
});
};
答案 8 :(得分:0)
您可以使用替代软件包,例如mongodb-promise
,也可以手动宣传mongodb
软件包API,方法是在其周围构建自己的承诺,或者通过像bluebird.promisify
这样的promise实用程序包
答案 9 :(得分:0)
看起来连接方法没有定义promise接口
http://mongodb.github.io/node-mongodb-native/2.1/tutorials/connect/
你总是可以在Mongodb连接器库中自己实现它,但这可能比你想要的更多。
如果你真的需要使用promises,你可以随时使用ES6 promise polyfill:
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>);
答案 10 :(得分:0)
这里是一个可以打开连接的衬里
export const openConnection = async () =>
await MongoClient.connect('mongodb://localhost:27017/staticback')
并这样称呼它
const login = async () =>
const client = await openConnection()