2016-04-20 13 views
0

Dies ist super verrückt. Ich konnte es beheben, indem ich Code umlegte ... aber ich weiß nicht, warum - warum es überhaupt kaputt gegangen ist oder warum es das repariert hat. Der Zweck dieses Codes ist zu einem Ziel-Objekt zu bewegen (verwendet Goal Schema) von den goalsInactive Array an die goals Array des Benutzers. Der Code erzeugte unter einem Fehlerspeicher und abgestürzt:Mongoose Speicherverlust beim Verschieben Filialdokument zwischen Arrays dann ändern

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", 
    }); 
} 

Ich erkennen, dass der Grund für den Absturz ein außer Kontrolle geratenes Speicherproblem war in mongoose/lib/document.js, durch die Pfad Anmeldung als sie zu aktualisieren und zu realisieren, dass es unendlich Wege wurde zu schaffen. Die verdächtigen ursprünglichen Pfade sahen dies wie:

'goalsInactive.-1.pastMilestones.2.type', 
'goalsInactive.-1.pastMilestones', 

konnte ich dieses Problem beheben, indem Sie den Code zu diesem Wechsel:

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; 
    } 
} 

(dh das Objekt zu modifizieren, bevor es bewegt). Aber ich weiß nicht, warum genau das funktioniert hat!

Ich benutze Mungo 4.1.9, vielleicht wurde das Problem bereits behoben, aber ich bin vorsichtig mit der Aktualisierung, weil die Aktualisierung ähnliche seltsame Probleme erzeugen kann. Es ist auch erwähnenswert, dass die Milestone-Objekte auch ein eigenes Mungo-Schema haben.

Antwort

0

Okay, dazu kommen wieder fast ein Jahr später, scheint es, dass das Problem wahrscheinlich mir

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

statt

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

remove Aufruf ist offenbar nicht etwas, was Sie wollen, mit verwandt war zu tun, wenn Sie das Filialdokument in einem anderen Array wiederverwenden möchten!

Verwandte Themen