0

这太古怪了。我可以通过移动一些代码来修复它……但我不知道为什么——为什么它一开始就坏了,或者为什么它修复了它。此代码的目的是将目标对象(使用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,所以问题可能已经修复,但我对更新持谨慎态度,因为更新会产生类似的奇怪问题。值得注意的是,里程碑对象也有自己的猫鼬模式。

4

1 回答 1

0

好的,差不多一年后回到这个问题,似乎这个问题可能与我使用有关

user.goalsInactive.id(user.goalsInactive[i]._id).remove()

而不是

user.goalsInactive.pull({_id: user.goalsInactive[i]._id})

remove如果您打算在不同的数组中重用该子文档,那么调用显然不是您想要做的事情!

于 2017-01-22T22:28:54.077 回答