2017-10-11 121 views
0

我只是无法弄清楚这有什么问题。有谁知道我为什么会遇到这个错误?我正在使用Node,Express,MongoDB和Mongoose。问题迭代MongoDB对象数组

下面是代码,console.log()行只是为了调试,它们是抛出错误的东西。

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

这里是MongoDB中的user文件:

{ 
    "_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" 
     } 
    ] 
} 

而这里的散发出来控制台的一切:

{ _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) 

我无法找到一个答案,我可以不会发现错误,所以如果这是一个重复的问题,我很抱歉。并感谢您的帮助。

+1

典型的原因是您定义的模式与文档结构不匹配。你应该真的修复模式(这是从问题中缺少的),但在一个捏,添加'.lean()'即。 'User.findById(req.user._id).lean()。exec(function(err,foundUser){..' should you give you a immediate workaround。Show the schema if you need the correction corrected。 –

+0

你似乎有是正确的Neil,我重写了模式的这一部分,现在它正在工作,非常感谢,并且感谢'.lean()'上的这个技巧。 – Inertia

+0

这真的是关于你的模式的问题。在您的模式中与您存储的数据的形状不匹配,您可以交替使用像'founduser.get('purchases')'这样的方法来处理未正确定义的事物,并且没有默认分配的访问器,因为“形状”不匹配,但对“模板”没有任何帮助,因此您可以使用'.lean()'或其他方法将存储的数据转换为“原始”JavaScript对象,或者简单地修复架构 –

回答

0

错误是发生在这条线

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

这表明foundUser.purchases数组是空的,但是根据记录的数据,事实并非如此。

您能否确认发布的数据实际上是正确的日志信息。

+0

我可以肯定地确认我所显示的数据是被定位的数据。我刚刚得到它的工作。尼尔伦恩的评论似乎是正确的。我仍然不确定问题到底是什么,但他的评论激励我重写了该模式的一部分,现在它正在工作。非常感谢你的建议。 – Inertia