2015-11-02 5 views
5

Ho un database mongodb chiamato pokemon con un insieme chiamato pokemons. Qui è il mio tentativo di scrivere una funzione che farà un'operazione find() in MongoDB:Come restituire JSON da MongoDB in Node.js?

'use strict'; 

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

// db url 
var url = 'mongodb://localhost:27017/pokemon'; 

exports.getPokemonByName = function (name) { 

    MongoClient.connect(url, function(err, db) { 
    assert.equal(null, err); 
    var cursor = db.collection('pokemons').find({name: name}); 

    // how to return json? 
    }); 

}; 

Ho poi chiamare questa funzione in un altro file:

var express = require('express'); 
var router = express.Router(); 

router.get('/pokedex', function (req, res) { 
    res.jsonp(db.getPokemonByName('Dratini')); 
}) 

This link è disponibile a mostrare come accedere i dati MongoDB alla console eseguendo una sorta di metodo each() sull'oggetto del cursore, ma non so come eseguire return json tramite la funzione getPokemonByName. Ho provato a definire una matrice vuota sull'ambito radice della funzione getPokemonByName e inviare i dati a quell'array con ogni iterazione del metodo .each mostrato in quel collegamento, ma penso di non poter ancora restituire quell'array perché accade dopo il fatto .

BTW, lo sto facendo solo per divertimento e per imparare su MongoDB e Node.js, quindi non voglio usare o un ODM come Mongoose per fare un po 'di questo lavoro per me.

Grazie per qualsiasi aiuto!

Modifica

Solo per curiosità, per tutti coloro che sta leggendo questo, perché è a questa domanda sempre downvoted? È perché la risposta può essere raccolta da altre domande simili o qualcos'altro?

Grazie!

+1

Possibile duplicato di [Come restituire la risposta da una chiamata asincrona?] (Http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous-call) –

+1

controllalo: http://stackoverflow.com/questions/19696240/proper-way-to-return-json-using-node-or-express –

+0

Questi due collegamenti non sono correlati. Non ho davvero capito perché è downvoted. – Genc

risposta

5

ero in grado di rispondere alla mia domanda con l'aiuto di pagina github nodo nativo conducente monogodb: See here.

In sostanza, mi è stato fatto è stato solo definire la mia funzione esportata all'interno della funzione di connessione del MongoClient. Per qualche ragione pensavo che le esportazioni dei nodi dovessero essere nella radice del modulo, ma non è così. Ecco una versione finita:

'use strict'; 

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

// db url 
var url = 'mongodb://localhost:27017/pokemon'; 

var findDocuments = function(db, callback) { 
    // Get the documents collection 
    var collection = db.collection('pokemons'); 
    // Find some documents 
    collection.find({name: 'Dratini'}).toArray(function(err, docs) { 
    assert.equal(err, null); 
    // assert.equal(2, docs.length); 
    console.log("Found the following records"); 
    callback(docs); 
    }); 
} 

// Use connect method to connect to the Server 
MongoClient.connect(url, function(err, db) { 
    assert.equal(null, err); 
    console.log("Connected correctly to server"); 
    findDocuments(db, function(docs) { 
    console.log(docs); 
    exports.getPokemonByName = function() { 
     return docs; 
    } 
    db.close(); 
    }); 
}); 

E poi in un altro file:

var express = require('express'); 
var router = express.Router(); 

router.get('/pokedex', function (req, res) { 
    res.jsonp(db.getPokemonByName()); 
}); 

Naturalmente, questa soluzione richiede che io hardcode query, ma sto bene con che per ora. Attraverserò quel ponte quando ci andrò.

0

questo può aiutare

var cursor = db.collection('pokemons').find({name:name}).toArray(function(err,arr){ 
    return arr; 
}); 
+1

No, non è possibile restituire un valore in linea da una chiamata asincrona. –

0

È possibile utilizzare le richiamate sulla funzione di ricerca per restituire la JSON. Prova

exports.getPokemonByName = function (name,callback) { 

    MongoClient.connect(url, function(err, db) { 
    assert.equal(null, err); 
    var cursor = db.collection('pokemons').find({name: name},function(err,result){ 
     if(err) 
     { 
     callback(err,null); 
     } 

     if(result) 
     callback(null,result); 
    }); 

    }); 

}; 

router.get('/pokedex', function (req, res) { 
    db.getPokemonByName('Dratini',function(err,result){ 
    if(result) 
    { 
     res.jsonp(result); 
    } 
    }); 

}) 
+0

tuttavia la funzione 'getPokemonByName (name)' non restituisce nulla. –

+0

controlla la modifica. Utilizzando la richiamata ora per restituire il json. –

+1

Sembra che dovrebbe funzionare ma produce un errore di riferimento circolare: "TypeError: conversione della struttura circolare in JSON". Non posso dire perché. –