87 votes

Comment utiliser MongoDB avec des promesses dans Node.js?

J'ai essayé de découvrir comment utiliser MongoDB avec Node.js et dans les docs il semble que l'approche proposée est d'utiliser les callbacks. Maintenant, je sais que c'est juste une question de préférence, mais je préfère vraiment à l'aide de promesses.

Le problème est que je n'ai pas trouver 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 n'est pas la façon de le faire.

Est-il possible d'utiliser mongo db à l'intérieur de Nœud avec des promesses au lieu de rappels?

124voto

Green Points 3110

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) {})
 

18voto

PirateApp Points 1795

Étant donné qu'aucune des réponses ci-dessus mentionner comment le faire sans bluebird ou q ou toute autre fantaisie de la bibliothèque, permettez-moi d'ajouter mes 2 cents sur cette.

Voici comment faire un insert avec native ES6 promesses

    '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 l'un retour d'une promesse. Pour effectuer une insertion, voici mon 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});

Espérons que cela aide. Si vous avez des suggestions à faire mieux, faites-le moi savoir que je suis prêt à m'améliorer :)

11voto

Ceci est une réponse générale à 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 avoir converti 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, [Requiert le module bluebird]

 var Promise = require('bluebird');
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) {})
 

2voto

Simon Z. Points 367

AVERTISSEMENT 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 promisifyAll() de bluebirds 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);
});
 

1voto

markusthoemmes Points 2547

Vous pouvez utiliser un autre package, tel que mongodb-promise ou promisifier l'API du package mongodb manuellement en créant vos propres promesses autour de celui-ci ou via un package utilitaire de promesse tel que bluebird.promisify

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X