RangeError:mongoose超出了最大调用堆栈大小

时间:2014-07-08 12:43:58

标签: node.js mongodb mongoose

我正在尝试使用时间段进行聚合。然后,我想返回一个每天充满值的数组(没有找到文档时为0)。 aggeagate函数非常有效,但当我替换回调(以前称为console.log)时,这样:

Star.aggregate([{
    $match: {
      "mod": new mongoose.Types.ObjectId("53765a122c0cda28199df3f4"),
      "time_bucket.month": new TimeBucket().month
    }
    },
  {
    $group: {
      _id: "$time_bucket.day",
      stars: {
        "$sum": 1
      }
    }

      },
  {
    $sort: {
      '_id': 1
    }
      }],
function (err, mods) {
  console.log(err, mods);
  mods = mods.map(function (model) {
    return model.toObject ? model.toObject() : model
  });
  var i, time, docs = [];
  var hasGap = function (a, b) {
    a = a.replace(/-/g, '');
    b = b.replace(/-/g, '');
    return a - b !== 1
  }

  var process = function (i, mods, docs) {
    if (hasGap(mods[i]._id, mods[i + 1]._id)) {
      docs.push(0);
      return process(i, mods, docs)
    }
    docs.push(mods[i].stars);
    return process(i + 1, mods, docs)

  };
  process(0, mods, docs);
  console.log(docs);
});

我明白了:

C:\Users\Me\Nodejs\node_modules\mongoose\node_modules\mongodb\lib\mongodb\connection\base.js:245
        throw message;
              ^
RangeError: Maximum call stack size exceeded

1 个答案:

答案 0 :(得分:2)

您的process函数是递归的,并且没有通过不再调用process来破坏递归的路径。经典的无限递归堆栈溢出。

解决方案是更改process函数,以便检查是否在mods结果文档数组的末尾,然后只返回该点,而不是再次调用自身。

所以检查如下:

if (i >= mods.length) return;