这太古怪了。我可以通过移动一些代码来修复它……但我不知道为什么——为什么它一开始就坏了,或者为什么它修复了它。此代码的目的是将目标对象(使用Goal
模式)从goalsInactive
数组移动到goals
用户的数组。下面的代码产生了内存错误并崩溃了:
for (i = 0; i < user.goalsInactive.length; i++) {
if (user.goalsInactive[i].code == code) {
user.goals.splice(ixToInsert, 0, new storage.Goal(user.goalsInactive[i]));
user.goalsInactive.id(user.goalsInactive[i]._id).remove();
break;
}
}
var pastMilestones = user.goals[ixToInsert].pastMilestones;
lastMilestone = pastMilestones && pastMilestones.length && pastMilestones[pastMilestones.length-1];
// crashes with code below active. if lines below disabled, runs fine
if (lastMilestone.type === 'endgoal') {
lastMilestone.type = "checkpoint"
pastMilestones.push({
ymd: cu.getYmdForUser(user),
name: "Goal Un-Completed",
});
}
mongoose/lib/document.js
通过在路径更新时记录路径并意识到它正在创建无限路径,我意识到崩溃的原因是内存失控问题。可疑的原始路径如下所示:
'goalsInactive.-1.pastMilestones.2.type',
'goalsInactive.-1.pastMilestones',
我可以通过将代码更改为此来解决此问题:
for (i = 0; i < user.goalsInactive.length; i++) {
if (user.goalsInactive[i].code == code) {
var pastMilestones = user.goalsInactive[i].pastMilestones;
lastMilestone = pastMilestones && pastMilestones.length && pastMilestones[pastMilestones.length-1];
// console.log("lastMilestone", lastMilestone);
if (lastMilestone.type === 'endgoal') {
lastMilestone.type = "checkpoint"
pastMilestones.push({
ymd: cu.getYmdForUser(user),
name: "Goal Un-Completed",
});
}
user.goals.splice(ixToInsert, 0, new storage.Goal(user.goalsInactive[i]));
user.goalsInactive.splice(i,1);
break;
}
}
(即在移动之前修改对象)。但我不知道为什么这确实有效!
我使用的是 mongoose 4.1.9,所以问题可能已经修复,但我对更新持谨慎态度,因为更新会产生类似的奇怪问题。值得注意的是,里程碑对象也有自己的猫鼬模式。