【发布时间】:2018-10-29 23:09:12
【问题描述】:
我正在尝试从 OMDB 数据库中获取数据以显示电影。最初我已经实现了点击事件来调用数据并且没有发现错误。但是当我切换到 keyup 事件时,我得到了这个错误。
Uncaught (in promise) TypeError: Cannot read property 'forEach' of undefined 在 fetchMovie.getMovies.then.res (main.js:27) fetchMovie.getMovies.then.res@main.js:27 异步函数(异步) searchInput.addEventListener@main.js:19
let searchInput = document.getElementById('search')
class fetchData {
constructor() {
this.apiKey = 'here is APIKey'
}
async getMovies(movie) {
const movieRes = await fetch(`http://www.omdbapi.com/?apikey=${this.apiKey}&s=${movie}`)
const moveData = await movieRes.json()
return {
moveData
}
}
}
const fetchMovie = new fetchData
searchInput.addEventListener('keyup', (e) => {
let input = e.target.value
if (input !== '') {
fetchMovie.getMovies(input)
.then(res => {
let data = res.moveData.Search
let output = ''
data.forEach(movie => {
output += `
<div class="col-md-3">
<div class="card" style="width: 18rem;">
<img class="card-img-top" src="${movie.Poster}" alt="Card image cap">
<div class="card-body">
<h5 class="card-title">${movie.Title}</h5>
<p class="card-text">${movie.Year}</p>
<a href="#" class="btn btn-primary">Go somewhere</a>
</div>
</div>
</div>`
});
document.getElementById('container').innerHTML = output;
})
}
e.preventDefault();
})
截图
用空图像修复的错误还添加了 keyup 事件。控制台没有错误
let searchInput = document.getElementById('search');
class fetchData {
constructor() {
this.apiKey = '884df292'
}
async getMovies(movie) {
const movieRes = await fetch(`http://www.omdbapi.com/?apikey=${this.apiKey}&s=${movie}`)
const moveData = await movieRes.json()
return {
moveData
}
}
}
const fetchMovie = new fetchData
searchInput.addEventListener('keyup', (e) => {
let input = e.target.value;
if (input !== '') {
fetchMovie.getMovies(input)
.then(res => {
let data = res.moveData.Search
console.log(data)
if (!data) {
return false
} else {
let output = ''
data.forEach(movie => {
let poster
if (movie.Poster === "N/A") {
poster = `https://upload.wikimedia.org/wikipedia/commons/a/ac/No_image_available.svg`
} else {
poster = movie.Poster
}
output += `
<div class="col-md-3 movie-card">
<div class="card">
<img class="card-img-top" src="${poster}" alt="Card image cap">
<div class="card-body">
<h5 class="card-title">${movie.Title}</h5>
<p class="card-text">${movie.Year}</p>
<a href="#" class="btn btn-primary">Go somewhere</a>
</div>
</div>
</div>`
});
document.getElementById('container').innerHTML = output;
}
})
.catch(err => console.log(err))
}
e.preventDefault();
})
【问题讨论】:
-
如果你依赖于用户输入,你应该明确地添加适当的错误处理
-
您获取电影的方式可能存在错误。我不熟悉 API,但您的错误上方可能有两行拼写错误。你输入了
res.moveData,而你的意思可能是res.movieData -
尝试记录
res.moveData是什么。 -
@MichaelKarpinski 尽管在任何地方都没有
movieData,但moveData工作得很好——很确定这只是一个缩写,而不是拼写错误 -
如果
res.moveData是一个电影数组,那么它就不是一个属性为Search的对象,所以当然访问moveData.Search是未定义的......
标签: javascript api async-await fetch