useEffect 在页面加载错误时调用 API
useEffect calling API on page load errors
我正在从事一个项目,该项目利用 IGDB 显示有关各种视频游戏标题的信息。我在搜索页面上收到了一个 API 调用,它 return 适当地提供了信息。单击搜索中的其中一个标题后,我会加载一个包含游戏详细信息的新页面。 API 对详细信息的调用与对搜索功能的调用完全相同(除了它们从数据库中检索不同的字段,除此之外,完全相同)并且 return数据适当且格式完全相同(objects 的数组。)但是,我在游戏详细信息页面上显示数据时遇到了很多麻烦。
这是我无法显示的回复:
并且,为了尽可能多地为你们提供详细信息,以下是搜索页面成功显示的响应:
我设置它的方式是 运行 在页面加载时使用一个 useEffect 挂钩。钩子确实 运行,并且数据被 returned,但显示数据一直是一个挑战。这是当前的钩子。
useEffect(() => {
async function getGameId(gameId) {
const response = await getSpecificGame(gameId);
if (!response.ok) {
throw new Error('Something went wrong...');
}
const result = response.json();
const gameData = result?.map((game) => ({
gameId: game.id,
name: game.name,
cover: game.cover,
summary: game.summary,
platforms: game.platforms,
genres: game.genres,
}));
setSelectedGame(gameData);
}
getGameId(gameId);
}, [])
使用此代码我收到以下错误:
Uncaught (in promise) TypeError: result.map is not a function
由于 result.map 出现错误,我不知道该从哪里开始。我想知道 response.json() 行是否不必要或放错了地方,但是数据 returning 的方式与搜索页面的方式完全相同,我不确定我会怎么做需要改变。错误不会在响应中抛出,这意味着数据返回正常,但它会在 result.map() 行上抛出,这意味着结果 = response.json() 不知何故 incorrect/unnecessary ,或者我错过了另一条需要在那里的线。但这让我非常困惑,因为我进行的另一个 API 调用可以执行搜索,并且设置方式相同。对于额外的上下文,我也会从搜索页面 post 正常运行 API 调用,这个在表单处理程序中:
const handleFormSubmit = async (event) => {
event.preventDefault();
if (!searchInput) {
return false;
}
try {
const response = await getGame(searchInput);
if (!response.ok) {
throw new Error('Something went wrong...');
}
const result = await response.json();
const gameData = result.map((game) => ({
gameId: game.id,
name: game.name,
cover: game.cover,
}));
setSearchedGames(gameData);
setSearchInput('');
} catch (err) {
console.error(err);
}
};
这些函数附带 API 调用。
export const getGame = (searchInput) => {
return fetch(`https://id.twitch.tv/oauth2/token?client_id=************&client_secret=****************&grant_type=client_credentials`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
}
})
.then(response => response.json())
.then(data => {
const accessToken = data.access_token;
return fetch(`https://fathomless-river-46653.herokuapp.com/https://api.igdb.com/v4/games/`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Client-ID': '***********',
'Authorization': `Bearer ${accessToken}`
},
body: `
search "${searchInput}";
fields name,cover.url;`
})
});
};
export const getSpecificGame = (gameId) => {
return fetch(`https://id.twitch.tv/oauth2/token?client_id=************&client_secret=**************&grant_type=client_credentials`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
}
})
.then(response => response.json())
.then(data => {
const accessToken = data.access_token;
return fetch(`https://fathomless-river-46653.herokuapp.com/https://api.igdb.com/v4/games/`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Client-ID': '**************',
'Authorization': `Bearer ${accessToken}`
},
body: `
fields name,summary,platforms.name,genres.name,cover.url;
where id = ${gameId};`
})
});
}
这似乎是一个简单的问题,适当地更改语法以使用 useEffect 而不是表单处理程序来运行,但事实证明这是一个相当大的挑战。我已经查看了大约 20 个类似问题的线程,但是 none 其中已经能够解决我的问题。
我想知道我是否应该完全走另一条路,完全删除 useEffect 钩子并尝试其他东西,但这感觉像是一个学习如何使用 useEffect 的机会,所以我正在尽我最大的努力这个工作。
我很乐意附上任何额外的代码来帮助回答。我 post 昨天提出了一个非常相似的问题并收到了一些有用的回复,但从那以后我取得了进展并达到了另一个障碍点。预先感谢任何能够提供帮助的人!
const result = response.json();
这里有个小错误,需要await
它:
const result = await response.json();
在您从表单处理程序发布的另一个示例中,它已正确等待,因此可以正常工作。
我正在从事一个项目,该项目利用 IGDB 显示有关各种视频游戏标题的信息。我在搜索页面上收到了一个 API 调用,它 return 适当地提供了信息。单击搜索中的其中一个标题后,我会加载一个包含游戏详细信息的新页面。 API 对详细信息的调用与对搜索功能的调用完全相同(除了它们从数据库中检索不同的字段,除此之外,完全相同)并且 return数据适当且格式完全相同(objects 的数组。)但是,我在游戏详细信息页面上显示数据时遇到了很多麻烦。
这是我无法显示的回复:
并且,为了尽可能多地为你们提供详细信息,以下是搜索页面成功显示的响应:
我设置它的方式是 运行 在页面加载时使用一个 useEffect 挂钩。钩子确实 运行,并且数据被 returned,但显示数据一直是一个挑战。这是当前的钩子。
useEffect(() => {
async function getGameId(gameId) {
const response = await getSpecificGame(gameId);
if (!response.ok) {
throw new Error('Something went wrong...');
}
const result = response.json();
const gameData = result?.map((game) => ({
gameId: game.id,
name: game.name,
cover: game.cover,
summary: game.summary,
platforms: game.platforms,
genres: game.genres,
}));
setSelectedGame(gameData);
}
getGameId(gameId);
}, [])
使用此代码我收到以下错误:
Uncaught (in promise) TypeError: result.map is not a function
由于 result.map 出现错误,我不知道该从哪里开始。我想知道 response.json() 行是否不必要或放错了地方,但是数据 returning 的方式与搜索页面的方式完全相同,我不确定我会怎么做需要改变。错误不会在响应中抛出,这意味着数据返回正常,但它会在 result.map() 行上抛出,这意味着结果 = response.json() 不知何故 incorrect/unnecessary ,或者我错过了另一条需要在那里的线。但这让我非常困惑,因为我进行的另一个 API 调用可以执行搜索,并且设置方式相同。对于额外的上下文,我也会从搜索页面 post 正常运行 API 调用,这个在表单处理程序中:
const handleFormSubmit = async (event) => {
event.preventDefault();
if (!searchInput) {
return false;
}
try {
const response = await getGame(searchInput);
if (!response.ok) {
throw new Error('Something went wrong...');
}
const result = await response.json();
const gameData = result.map((game) => ({
gameId: game.id,
name: game.name,
cover: game.cover,
}));
setSearchedGames(gameData);
setSearchInput('');
} catch (err) {
console.error(err);
}
};
这些函数附带 API 调用。
export const getGame = (searchInput) => {
return fetch(`https://id.twitch.tv/oauth2/token?client_id=************&client_secret=****************&grant_type=client_credentials`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
}
})
.then(response => response.json())
.then(data => {
const accessToken = data.access_token;
return fetch(`https://fathomless-river-46653.herokuapp.com/https://api.igdb.com/v4/games/`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Client-ID': '***********',
'Authorization': `Bearer ${accessToken}`
},
body: `
search "${searchInput}";
fields name,cover.url;`
})
});
};
export const getSpecificGame = (gameId) => {
return fetch(`https://id.twitch.tv/oauth2/token?client_id=************&client_secret=**************&grant_type=client_credentials`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
}
})
.then(response => response.json())
.then(data => {
const accessToken = data.access_token;
return fetch(`https://fathomless-river-46653.herokuapp.com/https://api.igdb.com/v4/games/`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Client-ID': '**************',
'Authorization': `Bearer ${accessToken}`
},
body: `
fields name,summary,platforms.name,genres.name,cover.url;
where id = ${gameId};`
})
});
}
这似乎是一个简单的问题,适当地更改语法以使用 useEffect 而不是表单处理程序来运行,但事实证明这是一个相当大的挑战。我已经查看了大约 20 个类似问题的线程,但是 none 其中已经能够解决我的问题。
我想知道我是否应该完全走另一条路,完全删除 useEffect 钩子并尝试其他东西,但这感觉像是一个学习如何使用 useEffect 的机会,所以我正在尽我最大的努力这个工作。
我很乐意附上任何额外的代码来帮助回答。我 post 昨天提出了一个非常相似的问题并收到了一些有用的回复,但从那以后我取得了进展并达到了另一个障碍点。预先感谢任何能够提供帮助的人!
const result = response.json();
这里有个小错误,需要await
它:
const result = await response.json();
在您从表单处理程序发布的另一个示例中,它已正确等待,因此可以正常工作。