无法在 ejs 模板中显示 api 数据

Cannot display api data in ejs template

我可以检索 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>
            <% } %>

在您的 Node.js 代码中,您通过以下方式从 API 获取数据:

const data = await response.json();

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

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

> 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,它是一个对象数组,而不是 一个包含对象数组的对象 .

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