【问题标题】:Cannot display api data in ejs template无法在 ejs 模板中显示 api 数据
【发布时间】:2021-03-16 00:45:34
【问题描述】:

我可以检索 api 数据并 console.log 它,for 循环正确显示每个卡片 div 元素,但我无法获取每个项目的详细信息。

plant.js 控制器:

exports.postFindPlant = async (req, res) => {
    const plantName = req.body.searchPlant;
    const key = process.env.API_KEY;
    const urlAPI = `https://trefle.io/api/v1/plants/search?token=${key}&q=${plantName}`;
    try {
        const response = await fetch(urlAPI);
        const data = await response.json();
        if (data.meta.total === 0) {
            console.log('nada');
        } else {
            console.log(data.meta.total);
            let plants = JSON.stringify(data);
            res.render('plants', {
                plants: plants,
                pageTitle: 'Plants',
                path: '/plants',
                hasPlants: plants.length > 0
              });
        }
    } catch (err) {
        console.log(err);
    }
};

plants.ejs:

<% for(var i=0; i < plants.length; i++) { %>
            <div class="col s12 m4">
                    <div class="card">
                        <div class="card-image waves-effect waves-block waves-light">
                          <img class="activator" src="<%= plants[i].image_url %>">
                        </div>
                        <div class="card-content">
                          <span class="card-title activator grey-text text-darken-4"><%= plants[i].common_name %><i class="material-icons right">MORE</i></span>
                        </div>
                        <div class="card-reveal">
                          <span class="card-title grey-text text-darken-4"><%= plants[i].common_name %><i class="material-icons right">CLOSE</i></span>
                          <p><%= plants[i].scientific_name %></p>
                          <p><a href="/plant-details/<%= plants[i].id %>">Plant Details</a></p>
                        </div>
                    </div>
            </div>
            <% } %>

【问题讨论】:

  • response.json() 是否在您的控制器代码中返回 Object?然后你不能通过你的 for 循环中的索引访问它的值,除非它是一个 Array
  • 所以,检查dataresponse.json的结果)的格式,循环并以正确的方式选择你想要的数据。喜欢而不是plants[0].scientific_name,也许应该是plants.data.scientific_name?请记住 dataplants 是相同的变量,但仅在您的代码中字符串化之后。
  • 嗨卡西米尔,感谢您的帮助。将plants[i].scientific_name 更改为plants.data.scientific_name 会引发参考错误。当我 console.log(data) 返回一个带有对象数组的 obj 时
  • 让植物 = JSON.stringify(data);控制台日志(植物);返回{"data":[{"id":132808,"common_name":"Centipede tongavine", ...
  • 我已经发布了该问题的答案,它解释了您发布的问题的起源问题。

标签: node.js json ejs


【解决方案1】:

在您的 Node.js 代码中,您从 API 获取数据:

const data = await response.json();

通常,从 API 返回的一些数据包含很多带有键的信息,因此它可能是一个对象。 (我猜到了,但在 cmets 中得到了证实)

然后,如果你想从一个对象访问任何信息,你必须通过它的键来引用值。例如:

> const person = { name: "Alan", age: 20 }
undefined
> person.name
'Alan'
> person.age
20

但是如果它是一个包含数组的对象,并且你想访问数组的数据,你可以使用数组索引在引用数组后使用它的键在对象中。

> const person = { name: "Alan", age: 20 }
undefined
> const person2 = { name: "Alice", age: 18 }
undefined
> const people = { type: "Human", data: [person, person2] }
undefined
> people
{
  type: 'Human',
  data: [ { name: 'Alan', age: 20 }, { name: 'Alice', age: 18 } ]
}
>

例如,如何在我上面的代码中得到Alice

> people.data
[ { name: 'Alan', age: 20 }, { name: 'Alice', age: 18 } ]
> people.data[1]
{ name: 'Alice', age: 18 }
> people.data[1].name
'Alice'
>

在您的情况下,您将对象解析为 JSON,并将其传递到您的 Ejs 代码中。它仍然是一个对象,所以我假设你知道如何在plants.ejs 中使用正确的键来引用你想要的值,而你需要的只是plants.data。然后,只需在下面更改 plant.js 控制器的这一行:

let plants = JSON.stringify(data);

类似于:

let plants = JSON.stringify(data).data;

有什么不同?再看一下我上面的例子,这里指的是people.data,它是一个对象数组,而不是包含一个对象数组的一个对象 p>

所以希望你已经完全了解问题是什么,以及如何解决它。

【讨论】:

  • 顺便说一句,如果您的代码仍然无法运行,请持有它,阅读 API 的文档,尝试使用您的令牌在 nodejs 控制台中获取数据。然后你把控制台中的“你是如何得到你需要的正确数据”的方式复制到ejs代码中,就完成了。
猜你喜欢
  • 2019-06-05
  • 2019-08-21
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
  • 2020-10-13
相关资源
最近更新 更多