如何实现 API 调用服务器并在单击按钮时显示数据(React、Node、Express)
How to implement API call to server and display data on button click (React, Node, Express)
编辑:我已经调试并提供了以下一些问题的答案。
我已经研究这个问题一段时间了,但似乎找不到合适的解决方案。正如您将在查看我的代码时看到的那样,我有很多东西要学。尽管我放置了多余的 await,但问题似乎来自于尝试显示尚未完成获取的数据。我也很好奇是否应该将 getData() 函数放在 useEffect 挂钩中?问题是我在提交按钮的 onClick 中使用了 getData() 函数。因此,当我 运行 我的应用程序时,getData() 仅在 useEffect 的范围内可用。
const getData = async () => {
if(searchData.platform !== "" && searchData.platformUserIdentifier !== ""){
setValidInput(true);
const response = await fetch(`http://localhost:8080/data?platform=${searchData.platform}&username=${searchData.platformUserIdentifier}`);
const json = await response.json();
await finishAllOperations(json)
} else {
setValidInput(false);
}
}
function finishAllOperations(json) {
if(json.code === "ERR_BAD_REQUEST"){
console.log(`Request failed with a status code ${json.status}`);
setErrorMessage(true);
setDisplayTable(false);
} else {
console.log("Request successful");
setMatches(json);
setErrorMessage(false);
setDisplayTable(true)
}
}
const displayMatchRows = matches.map((match,index) => {
//dummy data to populate if reward is available
function checkRewardAvailability(match){
const value = Math.random()
if (value <= .5) {
return true
} else {
return false
}
}
return (
<tr key={match.id}>
<td>{index+1}</td>
<td>{parseDate(match.metadata.endDate.value)}</td>
<td>{match.stats.kills.value}</td>
<td>{match.stats.rankScore.value}</td>
<td>{checkRewardAvailability()?<button className="reward-button">Claim Reward</button>:""}</td>
</tr>
)
})
当我将代码部署到我的节点服务器并尝试使用上述代码提交 API 调用时,我收到以下错误:
TypeError: b.map is not a function
此外,当我 运行 我的程序与我的客户端和服务器 运行 在不同的终端上运行时,我的代码可以正常工作并且数据可以正确显示。但是,“请求成功”控制台日志出现在提取完成 运行ning 之前。显然,我希望在我完全完成所有数据的获取后出现“请求成功”(见附件截图)。
"Request Success" before fetch finish
我真的很感谢任何意见,因为我差点砸了我的电脑。提前谢谢你。
我很高兴地报告,经过几个小时的调试,错误来自我的 .env 文件,它提供了一个未定义的值,因为它没有与我的 package.json 文件一起移动。
因为 .env 文件在错误的位置,我没有得到 .map 可以处理的数组。当我意识到我收到的错误与服务器的 API 调用有关时,我收到了一个错误
{"code":"ERR_HTTP_INVALID_HEADER_VALUE"}
这对我来说似乎很模糊,花了一些时间才找到。如果您收到此错误并且您正在使用 .env 文件,请检查以确保它没有返回未定义的值。如果未定义,请确保 .env 文件与 package.json 文件位于同一目录中。
编辑:我已经调试并提供了以下一些问题的答案。
我已经研究这个问题一段时间了,但似乎找不到合适的解决方案。正如您将在查看我的代码时看到的那样,我有很多东西要学。尽管我放置了多余的 await,但问题似乎来自于尝试显示尚未完成获取的数据。我也很好奇是否应该将 getData() 函数放在 useEffect 挂钩中?问题是我在提交按钮的 onClick 中使用了 getData() 函数。因此,当我 运行 我的应用程序时,getData() 仅在 useEffect 的范围内可用。
const getData = async () => {
if(searchData.platform !== "" && searchData.platformUserIdentifier !== ""){
setValidInput(true);
const response = await fetch(`http://localhost:8080/data?platform=${searchData.platform}&username=${searchData.platformUserIdentifier}`);
const json = await response.json();
await finishAllOperations(json)
} else {
setValidInput(false);
}
}
function finishAllOperations(json) {
if(json.code === "ERR_BAD_REQUEST"){
console.log(`Request failed with a status code ${json.status}`);
setErrorMessage(true);
setDisplayTable(false);
} else {
console.log("Request successful");
setMatches(json);
setErrorMessage(false);
setDisplayTable(true)
}
}
const displayMatchRows = matches.map((match,index) => {
//dummy data to populate if reward is available
function checkRewardAvailability(match){
const value = Math.random()
if (value <= .5) {
return true
} else {
return false
}
}
return (
<tr key={match.id}>
<td>{index+1}</td>
<td>{parseDate(match.metadata.endDate.value)}</td>
<td>{match.stats.kills.value}</td>
<td>{match.stats.rankScore.value}</td>
<td>{checkRewardAvailability()?<button className="reward-button">Claim Reward</button>:""}</td>
</tr>
)
})
当我将代码部署到我的节点服务器并尝试使用上述代码提交 API 调用时,我收到以下错误:
TypeError: b.map is not a function
此外,当我 运行 我的程序与我的客户端和服务器 运行 在不同的终端上运行时,我的代码可以正常工作并且数据可以正确显示。但是,“请求成功”控制台日志出现在提取完成 运行ning 之前。显然,我希望在我完全完成所有数据的获取后出现“请求成功”(见附件截图)。
"Request Success" before fetch finish
我真的很感谢任何意见,因为我差点砸了我的电脑。提前谢谢你。
我很高兴地报告,经过几个小时的调试,错误来自我的 .env 文件,它提供了一个未定义的值,因为它没有与我的 package.json 文件一起移动。
因为 .env 文件在错误的位置,我没有得到 .map 可以处理的数组。当我意识到我收到的错误与服务器的 API 调用有关时,我收到了一个错误
{"code":"ERR_HTTP_INVALID_HEADER_VALUE"}
这对我来说似乎很模糊,花了一些时间才找到。如果您收到此错误并且您正在使用 .env 文件,请检查以确保它没有返回未定义的值。如果未定义,请确保 .env 文件与 package.json 文件位于同一目录中。