2017-01-07 5 views
0

Я пытаюсь заполнить массив данными из базы данных mongoDB, используя mongoose. Когда я пытаюсь заполнить записи. Он показывает пустой массив вне функции, хотя я объявляю внешнюю функцию. Ниже приведен код.Возвращение пустого массива в NodeJs с помощью mongoose

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

Вам два других подходит для этого:

1) использование try и catch блок.

2) использовать ключевое слово async и ожидание.

Cheers!

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

кстати. saveMessageToVariable совсем не отражает, что делает эта функция. Вы должны выбрать лучшее имя.

 Смежные вопросы

  • Нет связанных вопросов^_^