Javascript 未捕获(承诺中)类型错误:data.forEach不是函数

Javascript 未捕获(承诺中)类型错误:data.forEach不是函数,javascript,html,Javascript,Html,在我的JavaScript代码中,我不断收到错误消息: 未捕获(承诺中)类型错误:data.forEach不是函数 HTML: JS: 工作 <script> let url = 'https://api.rust-servers.info/players/3450'; const playersDiv = document.querySelector('.players'); fetch(url) .then((res) => res.json())

在我的JavaScript代码中,我不断收到错误消息:

未捕获(承诺中)类型错误:data.forEach不是函数

HTML:

JS:

工作

<script>
  let url = 'https://api.rust-servers.info/players/3450';
  const playersDiv = document.querySelector('.players');
  fetch(url)
    .then((res) => res.json())
    .then((players) => {
      console.log(players);
      generateHtml(players)
    })
  const generateHtml = (data) => {
    var html = ``;
    data.forEach(player => {
      html += `<div class="name" style="position: relative; font-size: 20px;display: block;width: 100%;"><center>${player.name}</center>`;
    })
    playersDiv.insertAdjacentHTML('afterBegin', html)
  }

</script>

让url为空https://api.rust-servers.info/players/3450';
const playersDiv=document.querySelector('.players');
获取(url)
.然后((res)=>res.json())
.然后((玩家)=>{
控制台日志(播放器);
generateHtml(玩家)
})
const generateHtml=(数据)=>{
var html=`;
data.forEach(player=>{
html+=`${player.name}`;
})
playersDiv.insertAdjacentHTML('afterBegin',html)
}
不起作用

<script>
  let url1 = 'https://api.rust-servers.info/status/3450';
  const onlinernDiv = document.querySelector('.status');
  fetch(url1)
    .then((res) => res.json())
    .then((status) => {
      console.log(status);
      generateHtmls(status)
    })
  const generateHtmls = (data) => {
    var html = ``;
    data.forEach(status => {
      html += `<div class="name" style="position: relative; font-size: 20px;display: block;width: 100%;"><center>${status.players}</center>`;
    })
    onlinernDiv.insertAdjacentHTML('afterBegin', html)
  }

</script>


让url1=https://api.rust-servers.info/status/3450';
const onlinernDiv=document.querySelector('.status');
获取(url1)
.然后((res)=>res.json())
。然后((状态)=>{
控制台日志(状态);
生成HTML(状态)
})
const generateHtmls=(数据)=>{
var html=`;
data.forEach(状态=>{
html+=`${status.players}`;
})
onlinernDiv.insertAdjacentHTML('afterBegin',html)
}
第一个脚本有效,但第二个脚本无效。为什么在第二个脚本中出现错误?

第二部分(
https://api.rust-servers.info/status/3450
)导致该问题

服务器返回:

{
  "name": "Sharons Server",
  "status": "Online",
  "last_seen": "1583873401",
  "players": "19",
  "players_max": "200",
  "fps": "222",
  "uptime": "3 days, 13 hrs"
}

这是一个对象,而不是数组。所以你不能在上面使用
.forEach()

前几天我在调试前端时遇到了这个问题。 当返回一个对象时,forEach会中断,因此我们需要其他东西来迭代响应

有时候我的承诺会返回一个对象,有时候它会返回一个数组。 如果有很多结果需要排序,并且承诺花费的时间更长,我总会得到一个对象

因此,这对数组和具有行的对象都有效

if (Object.keys(players).length > 0) {
  for (const key in players) {
    html += '<div>' + players[key].status + '</div>';
  }
}
if(Object.key(players.length>0){
用于(康斯特键入玩家){
html+=''+玩家[键]。状态+'';
}
}

发生了什么错误?编辑我很笨,一般来说错误应该在正文中。@Phix标题中有错误。我认为除非你告诉我们什么是
数据
,否则任何人都帮不了你。它是一个数组吗?我打赌不是。谢谢大家!我可以在上面使用什么?你可以像这样访问值:
data.name
或者像这样迭代所有键:
对于(const-key-in-data){/*使用键做某事,使用data[key]*/}访问值
。进一步阅读:,我只需要将data.forEach更改为data.name?我只是那样做了,但似乎不起作用。(我是初学者,如果我问了很多问题,我很抱歉)不用担心。不,您不能只替换
数据。forEach
forEach
是一个仅对阵列可用的函数。然而,你有一个对象。使用
data.name
data.status
可以使用这些值(
“Sharons Server”
“Online”
)。您需要像这样重写代码:
html+=`${data.players}`以接收相同的结果
if (Object.keys(players).length > 0) {
  for (const key in players) {
    html += '<div>' + players[key].status + '</div>';
  }
}