【问题标题】:Returning empty array in NodeJs using mongoose使用猫鼬在NodeJs中返回空数组
【发布时间】:2017-02-19 16:27:45
【问题描述】:

我正在尝试使用 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);

}

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

【问题讨论】:

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


    【解决方案1】:

    这是一个异步调用,一旦从数据库控件中获取数据就会转移到下一行并因此打印初始值,我希望您使用这样的回调:

    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 关键字。

    干杯!

    【讨论】:

      【解决方案2】:

      我对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 根本没有反映这个函数的作用。你应该选择一个更好的名字。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-28
        • 2017-03-30
        • 2018-08-28
        • 2022-11-22
        • 2021-02-23
        • 2019-07-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多