问题迭代MongoDB对象数组
问题描述:
我只是无法弄清楚这有什么问题。有谁知道我为什么会遇到这个错误?我正在使用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)
我无法找到一个答案,我可以不会发现错误,所以如果这是一个重复的问题,我很抱歉。并感谢您的帮助。
答
错误是发生在这条线
console.log(foundUser.purchases[0].phrase);
这表明foundUser.purchases
数组是空的,但是根据记录的数据,事实并非如此。
您能否确认发布的数据实际上是正确的日志信息。
+0
我可以肯定地确认我所显示的数据是被定位的数据。我刚刚得到它的工作。尼尔伦恩的评论似乎是正确的。我仍然不确定问题到底是什么,但他的评论激励我重写了该模式的一部分,现在它正在工作。非常感谢你的建议。 – Inertia
典型的原因是您定义的模式与文档结构不匹配。你应该真的修复模式(这是从问题中缺少的),但在一个捏,添加'.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。 –
你似乎有是正确的Neil,我重写了模式的这一部分,现在它正在工作,非常感谢,并且感谢'.lean()'上的这个技巧。 – Inertia
这真的是关于你的模式的问题。在您的模式中与您存储的数据的形状不匹配,您可以交替使用像'founduser.get('purchases')'这样的方法来处理未正确定义的事物,并且没有默认分配的访问器,因为“形状”不匹配,但对“模板”没有任何帮助,因此您可以使用'.lean()'或其他方法将存储的数据转换为“原始”JavaScript对象,或者简单地修复架构 –