You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 06:47:29