使用mongoose

时间:2017-01-07 07:48:54

标签: javascript node.js mongodb mongoose mongoose-schema

我正在尝试使用mongoose从mongoDB数据库填充数组。当我试图填写记录。它显示了函数外部的空数组,即使我声明函数外部。以下是代码。

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

}

当我运行它时,日志显示一个空数组。我该如何解决这个问题?

2 个答案:

答案 0 :(得分: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和await关键字。

干杯!

答案 1 :(得分:0)

我对moongoose没有多少经验,但是according to the docs it supports promises since Version 4.

然后这应该有效:

jmeter.bat -n -t Scrept.jmx -l results.jtl

我不确定,您是否需要此代码中的//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); }) 并不反映此功能的作用。你应该选择一个更好的名字。