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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:33:27