2015-11-02 7 views
5

Ich habe eine mongodb-Datenbank namens pokemon mit einer Sammlung namens pokemons. Hier ist mein Versuch, eine Funktion zu schreiben, die einen find() Betrieb in mongodb tun:Wie man JSON aus MongoDB in Node.js zurückgibt?

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

}; 

ich dann rufen Sie diese Funktion in einer anderen Datei:

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

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

This link ist hilfreich bei der zeigt, wie mongodb Daten zu protokollieren zu der Konsole durch eine Art von each() Methode auf dem Cursor-Objekt, aber ich weiß nicht, wie return Json durch die getPokemonByName Funktion. Ich versuchte, eine leere Array auf dem Stammbereich der getPokemonByName Funktion und Push-Daten in das Array mit jeder Iteration der .each Methode zeigt in dieser Verbindung zu definieren, aber ich glaube, ich kann immer noch nicht das Array zurück, weil es nach der Tat passiert, .

BTW, ich mache das wirklich nur zum Spaß und um etwas über MongoDB und Node.js zu lernen, also möchte ich kein ODM wie Mongoose benutzen, um etwas von dieser Arbeit für mich zu erledigen.

Danke für jede Hilfe!

bearbeiten

Einfach nur neugierig, für jeden, der dies liest, warum diese Frage downvoted bekommen? Liegt es daran, dass die Antwort aus anderen, ähnlichen Fragen oder etwas anderem gewonnen werden kann?

Danke!

+1

Mögliches Duplikat von [Wie die Antwort von einem asynchronen Aufruf zurückgegeben wird?] (Http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous-call) –

+1

überprüfen Sie es: http://stackoverflow.com/questions/19696240/proper-way-to-return-json-using-node-or-express –

+0

Diese zwei Verbindungen sind nicht verwandt. Ich habe nicht wirklich verstanden, warum es abgelehnt wird. – Genc

Antwort

5

konnte ich meine Frage mit Hilfe von Knoten nativen monogodb Treiber Github Seite beantworten: See here.

Im Grunde war ich tat, war nur meine exportierte Funktion innerhalb der Verbindungsfunktion MongoClient definieren. Aus irgendeinem Grund dachte ich, dass Knotenexporte in der Wurzel des Moduls sein müssten, aber das ist nicht der Fall. Hier ist eine fertige Version:

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

Und dann in einer anderen Datei:

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

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

Natürlich ist diese Lösung erfordert, dass ich Anfragen hart codieren, aber ich bin okay, dass mit für jetzt. Werde diese Brücke überqueren, wenn ich dazu komme.

0

kann dies helfen

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

Nein, Sie können keinen Wert inline von einem asynchronen Aufruf zurück. –

0

Sie Rückrufe auf Suchfunktion die json zurückkehren können. Versuchen

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

Die Funktion "getPokemonByName (name)" gibt jedoch immer noch nichts zurück. –

+0

Überprüfen Sie die Bearbeitung. Callback jetzt verwenden, um den JSON zurückzugeben. –

+1

Scheint wie es sollte funktionieren, aber erzeugt einen zirkulären Referenzfehler: 'TypeError: Konvertieren der kreisförmigen Struktur in JSON'. Ich kann nicht sagen warum. –

Verwandte Themen