MongoDB关联用户数据后EJS模板无法读取user.name等字段问题求助
问题原因与解决方案
嘿,我一眼就看出问题出在哪啦!你在app.js里用了User.find({_id: post.user})来查询用户,而mongoose的find()方法无论匹配到多少条数据,返回的都是一个文档数组——哪怕只有一个用户符合条件,它也会把这个用户对象放在数组里返回。
这就导致你传到EJS模板里的user其实是个类似[ {name: 'xxx', email: 'xxx', ...} ]的数组,而不是单个用户对象。所以直接访问user.name时,数组本身没有name属性,自然会返回undefined;但你打印整个user数组,就能看到里面的用户数据啦。
两种解决办法任你选:
1. 改用findOne()或findById()(推荐)
既然你要查询单个用户,直接用返回单个对象的方法更合适:
// 方法一:findOne const user = await User.findOne({_id: post.user}); // 方法二:findById(更简洁,专门根据_id查询) const user = await User.findById(post.user);
改完之后,你在EJS里写<%= user.name %>、<%= user.username %>就能正常获取属性值了。
2. 保持find(),但在EJS里访问数组第一个元素
如果不想改后端代码,那就在EJS里明确取数组的第一个元素:
<p>Contributed by <span><%= user[0].name %></span> <span><%= post.date %></span></p> <%= console.log(user[0].username) %>
你可以先在app.js里加一行console.log(user)看看,用find()的话输出是带方括号的数组,用findOne()/findById()就是单个对象,这样就能确认问题啦~
内容的提问来源于stack exchange,提问作者Tushar
相关产品推荐
相关产品推荐

