2017-01-07 7 views
0

mongooseを使用してmongoDBデータベースからレコードを配列に書き込もうとしています。私はレコードを記入しようとしています。私は関数の外側を宣言していても、関数の外側に空の配列を示しています。以下はコードです。mongooseを使用したNodeJで空の配列を返します

var saveMessageToVariable = function(){ 
    var records = []; 
    var spark_ids = []; 
    var obj = new Object(); 
    Message.find().distinct("spark_id").exec(function(err,data) { 
     data.forEach(function (id) { 
      if(id != null) 
      spark_ids.push(id); 
     }); 
     // console.log(spark_ids.length); 
     spark_ids.forEach(function(spark_id){ 
       Message.findOne({"spark_id":spark_id}).sort({"date":-1}).exec(function(err,data){ 
        obj.spark_id = data.spark_id; 
        obj.meesage = data.message; 
        obj.date = data.date; 
        obj.message_id = data._id; 
        records.push(obj); 
    }); 
     }); 


    }); 

console.log(records); 

} 

これを実行すると、ログに空の配列が表示されます。この問題を解決するにはどうすればよいですか?

答えて

0

それは非同期呼び出しだと、すぐにデータが次の行にデータベース制御シフトからフェッチされ、したがって、初期値を出力して、私はこのようなコールバックを使用するためにあなたを希望:他の

function(spark_id,callback){ 
       Message.findOne({"spark_id":spark_id}).sort({"date":-1}).exec(function(err,data){ 
        obj.spark_id = data.spark_id; 
        obj.meesage = data.message; 
        obj.date = data.date; 
        obj.message_id = data._id; 
        callback(obj); 

    }); 
} 

function(obj) 
{ 
records.push(obj); 
} 

次の2つ

1)tryとcatchブロックを使用します。

2)asyncとawaitキーワードを使用します。

乾杯!

0

私は、これは動作するはずmoongooseで多くの経験を持っていますが、according to the docs it supports promises since Version 4.

ません:

//I assume you'll need this more often 
function notNull(value){ return value != null; } 

//returns a promise of the records-Array 
var saveMessageToVariable = function(){ 

    //returns a promise of a formated message 
    function getMessage(spark_id){ 
     return Message.findOne({ spark_id }) 
      .sort({ date: -1 }) 
      //.exec() 
      .then(formatMessage) 
    } 

    function formatMessage(msg){ 
     return { 
      spark_id: msg.spark_id, 
      message: msg.message, 
      date:  msg.date, 
      message_id: msg._id 
     } 
    } 

    return Message.find() 
     .distinct("spark_id") 
     //.exec() 
     .then(function(ids){ 
      //waits for all findOnes to complete, then returns an Array 
      return Promise.all(
       ids.filter(notNull).map(getMessage) 
      )); 
} 

あなたはexec()このコードまたは必要のない天気を私は、よく分かりません。それを確認する必要があります。

//usage 
saveMessageToVariable.then(function(records){ 
    console.log(records); 
}) 

btw。 saveMessageToVariableは、この関数の動作をまったく反映していません。あなたはより良い名前を選ぶべきです。

関連する問題