使用EJS调用MongoDB数据仅显示完整Schema,无法获取字段值
问题分析与解决方案
嘿,我一眼就发现你哪里出错啦!
核心问题:find()返回的是数组,不是单个对象
你用Prices.find({name: "prices"})查询时,MongoDB的find()方法不管匹配到1个还是多个文档,都会返回一个文档数组。你在EJS里看到的完整Schema字符串,其实是整个数组转成字符串后的结果——里面确实包含了你要的对象,但prices本身是数组,数组并没有btcPrice这个属性,所以<%= prices.btcPrice %>自然拿不到值。
两种解决办法
办法1:改用findOne()获取单个文档
如果你确定name: "prices"只会匹配到唯一的文档,直接用findOne()替代find(),它会返回匹配的单个对象,而不是数组:
router.get("/", function(req, res){ Prices.findOne({name: "prices"}, function(err, foundPrice){ if(err){ console.log(err); } else { // 这里把单个对象传给模板 res.render("landing", {prices: foundPrice}); } }); });
修改后,EJS里的<%= prices.btcPrice %>就能正常显示比特币价格了。
办法2:保持find(),访问数组的第一个元素
如果以后可能会有多个匹配的文档,或者你不想改路由代码,那在EJS里需要访问数组的第一个元素(也就是你要的那个对象):
<%= prices[0].btcPrice %>
要是以后有多个文档,还可以用循环遍历所有结果:
<% prices.forEach(function(priceItem) { %> <div> <p>比特币价格:<%= priceItem.btcPrice %></p> <p>以太坊价格:<%= priceItem.ethPrice %></p> <p>莱特币价格:<%= priceItem.ltcPrice %></p> </div> <% }) %>
小提醒
记住find()和findOne()的核心区别:
find():返回文档数组,哪怕只有一个匹配结果findOne():返回匹配的单个文档对象,如果没找到则返回null
内容的提问来源于stack exchange,提问作者Setheroni
相关产品推荐
相关产品推荐

