Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js RangeError:mongoose超过了最大调用堆栈大小_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js RangeError:mongoose超过了最大调用堆栈大小

Node.js RangeError:mongoose超过了最大调用堆栈大小,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我正在尝试使用时间桶进行聚合。然后,我希望每天返回一个充满值的数组(当找不到文档时为0)。aggegate函数工作得很好,但是当我替换回调函数(以前的console.log)时,如下所示: Star.aggregate([{ $match: { "mod": new mongoose.Types.ObjectId("53765a122c0cda28199df3f4"), "time_bucket.month": new TimeBucket().month

我正在尝试使用时间桶进行聚合。然后,我希望每天返回一个充满值的数组(当找不到文档时为0)。aggegate函数工作得很好,但是当我替换回调函数(以前的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

您的
进程
函数是递归函数,没有通过不再次调用
进程
而中断递归的路径。经典的无限递归堆栈溢出

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

所以一张支票是这样的:

if (i >= mods.length) return;

解决方案呢?@Julien请参阅更新的答案。如果不了解更多OP的数据,就很难更具体。