2016-06-19 19 views
28

Ho cercato di scoprire come utilizzare MongoDB con Node.js e nei documenti sembra che il modo consigliato sia quello di utilizzare i callback. Ora, so che è solo una questione di preferenza, ma io preferisco davvero usare le promesse.Come utilizzare MongoDB con promesse in Node.js?

Il problema è che non ho trovato il modo di usarli con MongoDB. In effetti, ho provato la seguente:

var MongoClient = require('mongodb').MongoClient; 

var url = 'mongodb://localhost:27017/example'; 

MongoClient.connect(url).then(function (err, db) { 
    console.log(db); 
}); 

e il risultato è undefined. In tal caso sembra che questo non sia il modo di farlo.

C'è un modo per utilizzare mongo db all'interno del nodo con promesse invece di callback?

+0

https://www.guru99.com/node-js-promise-generator-event.html Questo tutorial è è sbagliato??? –

risposta

0

È possibile utilizzare un pacchetto alternativo, come ad esempio mongodb-promise o promisify l'API mongodb pacchetto manualmente costruendo le proprie promesse intorno ad esso o tramite un pacchetto di utilità promessa come bluebird.promisify

+0

Il driver MongoDB ha già delle promesse (se si desidera bluebird è possibile specificare nelle opzioni o come lo si allega a global.Promise) NON FARE QUESTO! –

0

E non sembra il metodo connect ha definito un'interfaccia promessa

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

si può sempre implementare da soli nella biblioteca del connettore MongoDB, ma questo è probabilmente più complessa di quanto si sta cercando.

Se si ha realmente bisogno di lavorare con le promesse, si può sempre utilizzare la polyfill ES6 promessa:

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

e avvolgere il vostro codice di connessione con quello. Qualcosa di simile

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>); 
61

Il tuo approccio è quasi corretto, solo un piccolo errore nel tuo ragionamento

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

Esattamente! MongoDB Node.js driver 2.x _ "Restituisce: Promise se non viene passato alcun callback" _ i.a. di 'MongoClient.connect'. Se disponi di node.js <4 senza promesse ES6 integrate, puoi anche utilizzare uno shim promesso compatibile ES6 o fornire un'implementazione promessa ES6 compatibile con l'opzione 'promiseLibrary' di' MongoClient.connect'. – VolkerM

0

ATTENZIONE Edit:

Come ha osservato John Culviner, questa risposta è deprecato. Usa il driver, viene fornito con promesse OOTB.


Se si sceglie di utilizzare Bluebird come libreria promessa, è possibile utilizzare Bluebirds promisifyAll() funzione 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); 
}); 
+5

Il driver MongoDB ha già delle promesse (se vuoi bluebird puoi specificare in opzioni o come lo collego a global.Promise) NON FARE QUESTO! –

0

È necessario creare una promessa che si connette a Mongo.

Quindi, definire la funzione che utilizza questa promessa: myPromise.then(...).

Ad esempio:

function getFromMongo(cb) { 
    connectingDb.then(function(db) { 

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

    }); 
} 

Ecco il codice completo:

http://jsfiddle.net/t5hdjejg/

+0

Il driver MongoDB ha già delle promesse (se si desidera bluebird è possibile specificare nelle opzioni o come lo si allega a global.Promise) NON FARE QUESTO! –

+0

@JohnCulviner per quanto posso dire, .find non restituisce una promessa? Alcuni metodi fanno - .count() su un cursore, ad esempio - ma db.mycoll.find ({}). Quindi non è definito? – sil

+0

@sil db.get ("raccolta"). Find ({qualcosa: "a"}). Then(). Catch(); lavora per me –

13

Dal momento che nessuna delle risposte di cui sopra menzione come fare questo senza Bluebird o q o di qualsiasi altra libreria di fantasia, lasciatemi aggiungere i miei 2 centesimi su questo.

Ecco come si fa un inserto con nativo ES6 promette

'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; 

ho definito il mio metodo open() come quella di ritorno una promessa. Per eseguire un inserimento, ecco il mio snippet di codice sotto

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

Sperare che aiuti. Se hai qualche suggerimento per migliorarlo, fammelo sapere perché sono disposto a migliorare me stesso :)

+8

Hai una promessa in un'altra promessa. I metodi MongoClient stanno già restituendo una promessa e non è necessario ricominciare da capo. Questo è un tipico modello anti promessa. – westor

+4

Venendo mesi dopo, ma la risposta di @ Green 20 minuti dopo il post originale utilizza il supporto promessa nativo di mongodb.MongoClient e nessuna libreria di promesse estranee. – Owen