2016-12-20 2 views
0

私はmongo dbからの通知の全リストを取るが、空の([])配列も返す。私はコールバックまたはそれより短い方法が必要であることを知っている。 node.jsによるmongodbからのデータの収集に関する考えはありますか?私はこの/通知し法(http://127.0.0.1:5000/Notifies)を呼び出した場合node.jsでmongodb collection getallを呼び出す方法は?

var MongoClient = require('mongodb').MongoClient; 
var express = require("express"); 
var app = express(); 


format = require('util').format; 
MongoClient.connect('mongodb://127.0.0.1:27017/Test', function (err, db) { 
    if (err) { 
     throw err; 
    } else { 
     console.log("successfully connected to the database"); 
    } 
    db.close(); 
}); 

app.get('/Notifies', function (req, res) { 

    // BAD! Creates a new connection pool for every request 
    console.log('connected'); 
    MongoClient.connect('mongodb://127.0.0.1:27017/Test', function (err, db) { 
     if (err) throw err; 

     var coll = db.collection('Notifies'); 
     var arr = []; 
     coll.find({}, function (err, docs) { 
      docs.each(function (err, doc) { 
       if (doc) { 
        console.log(doc); 
        arr.push(doc); 

       } else { 
        res.end(); 
       } 
      }); 
     }); 
     return res.json(arr); 
    }); 
}); 

var port = Number(process.env.PORT || 5000); 
app.listen(port, function() { 
    console.log("Listening on " + port); 
}) 

答えて

2

ので、それは

MongoClient.connect('mongodb://127.0.0.1:27017/Test', function (err, db) { 
    if (err) throw err; 

    var coll = db.collection('Notifies'); 

coll.find({}).toArray(function (err,result) { 
       if(err){ 
        res.send(err); 
       } 
        else{ 

         res.send(JSON.stringify(result)); 
       } 
      }) 

}); 
1

問題は、実際のDB操作が発生する前に、関数内から空の配列を返すされています。あなたはfind関数に行return res.json(arr); を移動する必要があります。

app.get('/Notifies', function (req, res) { 

    // BAD! Creates a new connection pool for every request 
    console.log('connected'); 
    MongoClient.connect('mongodb://127.0.0.1:27017/Test', function (err, db) { 
     if (err) throw err; 

     var coll = db.collection('Notifies'); 
     var arr = []; 
     coll.find({}, function (err, docs) { 
      console.log(docs); 
      docs.each(function (err, doc) { 
       if (doc) { 
        console.log(doc); 
        arr.push(doc); 

       } else { 
        res.end(); 
       } 
      }); 
      return res.json(arr); 
     }); 
    }); 
}); 

また、将来の使用のために、ネストされた関数内の変数名を再利用していない(あなたは変数err使う3つの機能を持っています)。

+0

はい私はJSON文字列の配列に変換するJson.stringifyを使用し、直接配列を返し、この使用.toArrayの代わりにdocs.eachのために使用しないでください。しかし、結果は同じです... – Penguen

+0

'docs'の値を出力してみてください。空であれば、コレクションが空であるか、クエリが間違っています。 –

+0

編集した回答を確認してください。コンソールを見て 'docs'の値を見てください。完了したら 'console.log'を削除することを忘れないでください。がんばろう! –

関連する問題