Node.js RangeError:mongoose超过了最大调用堆栈大小
我正在尝试使用时间桶进行聚合。然后,我希望每天返回一个充满值的数组(当找不到文档时为0)。aggegate函数工作得很好,但是当我替换回调函数(以前的console.log)时,如下所示: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
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的数据,就很难更具体。