2015-11-02 14 views
5

pokemons adlı bir koleksiyona sahip pokemon adlı bir mongodb veritabanına sahibim.JSON MongoDB'den Node.js'ye nasıl dönülür?

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

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

This link mongodb verilerini günlüğe nasıl göstermek açısından yararlıdır:

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

}; 

Sonra başka dosyada bu işlevi çağırır: Burada MongoDB bir find() operasyonu yapacak bir işlev yazmak için benim girişimi imleç nesnesinde bir çeşit each() yöntemini yaparak konsola ancak getPokemonByName işlevini kullanarak return json'u bilmiyorum. getPokemonByName işlevinin kök kapsamı üzerinde boş bir dizi tanımlamaya çalıştım ve bu dizideki .each yönteminin her yinelemesiyle bu diziye veriyi itmeye çalıştım, ancak sanırım bu diziyi hala döndüremiyorum çünkü bu olaydan sonra olur .

BTW, Ben sadece MongoDB ve Node.js hakkında bilgi edinmek ve bunu öğrenmek için yapıyorum, bu yüzden bu işi benim için yapmak için kullanmak veya Mongoose gibi bir ODM kullanmak istemiyorum.

Yardımlarınız için teşekkürler!

Düzenleme

Sadece merak, bu okuyor herkes için, neden bu soru downvoted oluyor? Bunun nedeni, cevabın diğer, benzer sorulardan veya başka bir şeyden kaynaklanabileceğinden mi?

Teşekkürler!

+1

Olası yinelenen [Yanıtı eşzamansız bir çağrıdan nasıl geri döndürürüm?] (Http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous-call) –

+1

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

+0

Bu iki bağlantı birbiriyle ilgisiz. Gerçekten neden düşürüldüğünü anlamadım. – Genc

cevap

5

deneyin ben düğümün yerli monogodb sürücüsü github sayfasından yardımıyla soruma cevap başardı: Özünde See here.

, sadece MongoClient bağlantı fonksiyonu içinde benim ihraç işlevi tanımlayın bırakmaktı oldu. Bazı nedenlerden ötürü, düğüm ihracatının modülün kökünde olması gerektiğini düşündüm, fakat durum böyle değil. İşte bitmiş bir sürümü: Başka bir dosyada

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

Ve sonra:

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

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

, bu çözüm ben sorguları hardcode gerektirir, ama şimdilik için sorun yok. Geldiğimde köprüyü geçeceğim.

0

bu

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

Hayır Eşzamansız bir çağrıdan satır içi bir değer döndüremiyorsunuz. –

0

Sen json dönmek için bulmak işlevini geri aramalar kullanabilirsiniz yardımcı olabilir.

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

'getPokemonByName (name)' işlevi yine de hiçbir şey döndürmez. –

+0

düzenlemeyi kontrol edin. Jsonu geri vermek için hemen geri aramayı kullanmak. –

+1

Çalışması gerektiği gibi görünüyor, ancak dairesel bir referans hatası üretiyor: 'TypeError: Dairesel yapıyı JSON'a dönüştürme '. Neden olduğunu söyleyemem. –

İlgili konular