J'ai essayé de découvrir comment utiliser MongoDB avec Node.js et, dans la documentation, il semble que la méthode recommandée consiste à utiliser des rappels. Maintenant, je sais que c'est juste une question de préférence, mais je préfère vraiment utiliser des promesses.
Le problème est que je n'ai pas trouvé comment les utiliser avec MongoDB. En effet, j'ai essayé ce qui suit:
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/example';
MongoClient.connect(url).then(function (err, db) {
console.log(db);
});
Et le résultat est undefined
. Dans ce cas, il semble que ce ne soit pas la manière de le faire.
Est-il possible d'utiliser mongo db dans Node avec des promesses au lieu de rappels?
Votre approche est presque correcte, juste une petite erreur dans votre argument
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) {})
Puisqu'aucune des réponses ci-dessus ne dit comment faire cela sans bluebird, q ou toute autre bibliothèque de fantaisie, laissez-moi ajouter mes 2 centimes à ce sujet.
Voici comment faire une insertion avec des promesses natives 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;
J'ai défini ma méthode open () comme celle renvoyant une promesse. Pour effectuer une insertion, voici l'extrait de code ci-dessous.
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});
J'espère que ça t'as aidé. Si vous avez des suggestions pour améliorer la situation, faites-le moi savoir car je suis disposé à m'améliorer moi-même :)
Ceci est une réponse générale pour Comment utiliser MongoDB avec des promesses dans Node.js?
mongodb retournera une promesse si le paramètre de rappel est omis
Avant de convertir en promesse
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)
});
}
})
Après conversion en promesse
//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) {})
Si vous avez besoin de gérer plusieurs requêtes
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) {})
Vous pouvez aussi faire async/wait
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
}
ATTENTION Edit:
Comme John Culviner l'a noté, cette réponse est obsolète. Utilisez le pilote, il vient avec des promesses OOTB.
Si vous choisissez d'utiliser bluebird comme bibliothèque de promesses, vous pouvez utiliser la fonction bluebirds promisifyAll()
sur MongoClient:
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);
});
Solution de travail avec MongoDB version> 3.
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)
})
Vous pouvez utiliser un autre package, tel que mongodb-promise
ou promisifier l'API du package mongodb
manuellement en construisant vos propres promesses autour de celui-ci ou via un package d'utilitaire de promesse tel que bluebird.promisify
Il ne semble pas que la méthode connect ait une interface de promesse définie
http://mongodb.github.io/node-mongodb-native/2.1/tutorials/connect/
vous pouvez toujours l'implémenter vous-même dans la bibliothèque de connecteurs Mongodb, mais c'est probablement plus complexe que ce que vous recherchez.
Si vous avez vraiment besoin de travailler avec des promesses, vous pouvez toujours utiliser le polyfill ES6 promise:
https://github.com/stefanpenner/es6-promise
et envelopper votre code de connexion avec cela. Quelque chose comme
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>);
Vous devez créer une promesse qui se connecte à Mongo.
Ensuite, définissez votre fonction qui utilise cette promesse: myPromise.then(...)
.
Par exemple:
function getFromMongo(cb) {
connectingDb.then(function(db) {
db.collection(coll).find().toArray(function (err,result){
cb(result);
});
});
}
voici le code complet: