2017-10-11 2 views
0

Ich kann einfach nicht herausfinden, was damit nicht stimmt. Weiß jemand, warum ich diesen Fehler bekomme? Ich verwende Node, Express, MongoDB mit Mongoose.Problem Iterating MongoDB Array von Objekten

Hier ist der Code, die console.log() Zeilen sind nur zu debuggen und sie sind was den Fehler werfen.

// report view 
app.get("/report", isLoggedIn, function(req, res){ 
    User.findById(req.user._id, function(err, foundUser){ 
     if(err){ 
      console.log(err); 
      console.log(foundUser); 
     } else { 
      console.log(foundUser); 
      console.log(); 
      console.log(foundUser.purchases[0].phrase); 
      res.render("report.ejs", {user:foundUser}); 
     } 
    }); 
}); 

Hier ist das user Dokument in MongoDB:

{ 
    "_id" : ObjectId("59d4dc48fba3ef12437bf4b1"), 
    "salt" : "30dd9c9942...", 
    "hash" : "8c8c96d88a708...", 
    "username" : "Christian Lewis", 
    "email" : "[email protected]", 
    "signupDate" : ISODate("2017-10-04T13:04:08.167Z"), 
    "__v" : 6, 
    "purchases" : [ 
     { 
      "phrase" : "Porche 918 Spyder", 
      "location" : "South Yarra" 
     }, 
     { 
      "phrase" : "Blinds", 
      "location" : "United Kingdom" 
     } 
    ] 
} 

Und hier ist alles, was aus der Konsole kommt:

{ _id: 59d4dc48fba3ef12437bf4b1, 
    username: 'Christian Lewis', 
    email: '[email protected]', 
    __v: 6, 
    signupDate: 2017-10-04T13:04:08.167Z, 
    purchases: 
    [ { location: 'South Yarra', phrase: 'Porche 918 Spyder' }, 
    { location: 'United Kingdom', phrase: 'Blinds' } ] } 

events.js:160 
     throw er; // Unhandled 'error' event 
    ^

TypeError: Cannot read property 'phrase' of undefined 
    at /Volumes/Store/Lickety-Split/website/app.js:58:47 
    at Query.<anonymous> (/Volumes/Store/Lickety-Split/website/node_modules/mongoose/lib/model.js:3841:16) 
    at /Volumes/Store/Lickety-Split/website/node_modules/kareem/index.js:273:21 
    at /Volumes/Store/Lickety-Split/website/node_modules/kareem/index.js:131:16 
    at _combinedTickCallback (internal/process/next_tick.js:73:7) 
    at process._tickCallback (internal/process/next_tick.js:104:9) 

Ich kann keine Antwort auf diese Frage finden, kann ich Ich werde den Fehler nicht finden, also entschuldige ich mich, wenn das eine doppelte Frage ist. Und danke für jede Hilfe.

+1

Der typische Grund ist, dass Ihr definiertes Schema nicht mit der Dokumentstruktur übereinstimmt. Sie sollten das Schema wirklich korrigieren (was in der Frage fehlt), aber zur Not, '.lean()' ie hinzufügen. 'User.findById (req.user._id) .lean(). Exec (function (err, foundUser) {..' sollte Ihnen eine sofortige Abhilfe bieten. Zeigen Sie das Schema, wenn Sie die Korrektur benötigen. –

+0

Sie scheinen zu haben war korrekt Neil. Ich habe diesen Abschnitt des Schemas umgeschrieben und es funktioniert jetzt. Vielen Dank. Und vielen Dank für diesen Tipp auf '.lean()'. – Inertia

+0

Es geht wirklich um Ihr Schema. Das Problem ist, dass 'Käufe' wie definiert in Ihrem Schema nicht mit der Form übereinstimmt, die Sie gespeichert haben Sie können Methoden wie 'founduser.get ('purchases')' für Dinge verwenden, die nicht korrekt definiert sind und denen aufgrund der stimmt nicht mit "shape" überein, aber das hilft nicht wirklich in "templates". Entweder verwenden Sie '.lean()' oder andere Methoden, um die gespeicherten Daten in ein "rohes" JavaScript-Objekt zu konvertieren oder einfach das Schema zu reparieren. –

Antwort

0

Der Fehler wird auf dieser Linie passiert

console.log(foundUser.purchases[0].phrase); 

Dies würde vorschlagen foundUser.purchases Array leer ist, aber auf der Grundlage Ihrer Daten protokolliert, ist es nicht.

Können Sie bestätigen, dass die gebuchten Daten in der Tat die richtigen Protokollinformationen sind.

+0

Ich kann sicher bestätigen, dass die Daten, die ich gezeigt habe, die Daten sind, auf die abgezielt wird. Ich habe es gerade funktioniert. Neil Lunns Kommentar scheint korrekt zu sein. Ich bin mir immer noch nicht sicher, was genau das Problem ist, aber sein Kommentar hat mich inspiriert, diesen Teil des Schemas neu zu schreiben, und es funktioniert jetzt. Vielen Dank für Ihren Vorschlag, sehr geschätzt. – Inertia

Verwandte Themen