2015-11-02 14 views
5

pokemonsというコレクションを持つpokemonというmongodbデータベースがあります。ここではMongoDBの中find()操作を行います関数を記述するために私の試みです:Node.jsのMongoDBからJSONを返す方法は?

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

}; 

私はその後、別のファイルにこの関数を呼び出す:

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

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

This linkはMongoDBのデータをログに記録する方法を示す際に便利ですカーソルオブジェクトにeach()メソッドの何らかの処理を行うことでコンソールに接続しますが、getPokemonByName関数を使用してreturnjsonに移動する方法はわかりません。私はgetPokemonByName関数のルートスコープに空の配列を定義し、そのリンクに.eachメソッドの各繰り返しを表示してデータをその配列にプッシュしようとしましたが、実際にはその配列の後に起こるため、 。

私は実際にこれを楽しみながら、MongoDBとNode.jsについて学ぶために、MongooseのようなODMを使いたくないので、私のためにこの仕事のいくつかをしています。

ありがとうございました!

編集

興味があるだけ、これを読んでいる人のために、なぜこの質問は、downvotedなっていますか?それは答えが他の、類似の質問、または他の何かから集められることができるからですか?

ありがとうございます!

+1

[非同期呼び出しから応答を返す方法]の複製がありますか?(http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous-call) –

+1

それをチェックしてください:http://stackoverflow.com/questions/19696240/properway-to-return-json-using-node-or-express –

+0

これらの2つのリンクは無関係です。なぜそれがdownvotedされているかは分かりませんでした。 – Genc

答えて

5

を試してみてください。本質的にはSee here.

を、私はちょうどMongoClientの接続機能の中に私のエクスポートされた関数を定義したなかったでした。何らかの理由で、私はノードのエクスポートがモジュールのルートになければならないと考えましたが、そうではありません。ここでは、完成したバージョンです:

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

はその後、別のファイルに:もちろん

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

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

、この解決策は、私は、クエリをハードコーディングする必要がありますが、私は今のところ大丈夫です。私がそれに来るとき、その橋を渡ります。

0

これはあなたがJSONを返すように検索機能にコールバックを使用することができます

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

いいえ非同期呼び出しから値をインラインで返すことはできません。 –

0

に役立つことがあります。 私は、ノードのネイティブmonogodbドライバgithubのページからの助けを借りて、私の質問に答えることができた

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)'関数はまだ何も返しません。 –

+0

編集を確認します。コールバックを使用してjsonを返します。 –

+1

動作するはずですが、循環参照エラーを生成します: 'TypeError:循環構造をJSONに変換する'。理由を言うことはできません。 –

関連する問題