开发者问题收集

为什么我返回 API 数据时会出现错误:无法读取未定义的属性“结果”?

2021-10-21
38

所以这实际上是一个新问题,因为我之前的问题不太清楚,所以我不得不删除它。 我有一个函数,它从父函数中获取 api 数据,并将 div 包含的内容更改为此 api 数据。

父函数:

function searchBook(query){
    const url = BASE_URL + `${query}` + '&' + API_KEY;

    fetch(url)
    .then(res => res.json())
    .then(books =>{
        console.log(books);
    })
    .then(books => showBooks(books.results));

因此,它会获取一个 api 并将其打印在控制台中。但在下一个承诺中,我想调用一个函数,通过将书籍添加到 div 中来在页面上显示书籍:

showBooks = books =>{
    const main = document.getElementById('book_container');
    main.innerHTML = "";
    books.forEach(book => {
        const bookEl = document.createElement('div');
        bookEl.classList.add('book');

        bookEl.innerHTML = `
        <div class="book">
        <div class="border"></div>
            <img src="img/cover.jpg">
    <div class="book_info">
            <h3>${book.title}</h3>
            <p>${book.authors}</p>
    </div>
    <div class="overview">
            <p>${book.description}</p>
    </div>
</div>
        `

        main.appendChild(bookEl);
    });
}
}

它应该通过“.then”承诺从 searchBooks 函数获取书籍数据,但由于某种原因,它返回下一个错误: 在此处输入图像描述

因此,当我从 showBooks(books.results) 中删除结果时,它会返回下一个错误: 在此处输入图像描述

在此处输入图片描述

由于某种原因,数据未定义,尽管它是通过承诺传递的,所以我不确定可能是什么原因。 我在互联网上搜索了同样的方法,它似乎工作正常,但在我的应用程序中它不起作用。 它在控制台中打印数据,所以数据毕竟被传递了,但由于某种原因它在 showBooks 函数中不起作用。

2个回答
function searchBook(query){
const url = BASE_URL + `${query}` + '&' + API_KEY;

fetch(url)
.then(res => res.json())
.then(books =>{
    console.log(books);
    return books;
})
.then(books => showBooks(books.results));

您的第二个 .then() 需要返回数据以便在第三个 .then(books => showBooks(books.results))

Antoine
2021-10-21

您可以删除

.then(books =>{
        console.log(books);
    }

或让其返回 books ,以便下一个 then 可以使用:

.then(books =>{
        console.log(books);
        return books;
    }
tromgy
2021-10-21