开发者问题收集

TypeError 的原因:无法读取未定义的属性

2022-03-08
2619

我正在尝试从 API 中获取一些数据。当我将结果记录到控制台(如 console.log(liveInfo.tracks) )时,以下代码“有效”,但当我尝试执行 console.log(liveInfo.tracks.current) 时,它会失败并显示以下错误: TypeError:无法读取未定义的属性(读取“current”)liveInfo.tracks.current 不是人们通常访问键值对的方式吗?

componentDidMount() {
 fetch('https://kchungradio.airtime.pro/api/live-info-v2')
 .then(res => res.json())
 .then(
  (result) => {
   this.setState({
    isLoaded: true,
    liveInfo: result 
   })
  }
 )
}

json 看起来或多或少像这样:

{
 "station": {
  "env": "production",
 },
 "tracks": {
  "previous": {
   "name": "a",
   "metadata": {
    "id": 1,
   },
  },
  "current": {
   "name": "b",
   "metadata": {
    "id": 2,
   }
  }
 }
}
   
3个回答

因为在某个时刻 liveInfo.tracksundefined

虽然缺乏提示,但从生命周期获取数据时的一个常见错误是尝试在 setData 发生之前通过状态检索值。
在使用 liveInfo 之前,请确保数据获取已完成

像这样

class SomeComponent = {
render() {
if(!this.state.liveInfo?.tracks?.current) return null
....
}

}
MINJA KIM
2022-03-08

看起来您正在尝试在 componentDidMount 上填充 current 之前访问它,这意味着在执行提取之前。我建议您像这样初始化状态:

  state = {
    isLoaded: false,
    liveInfo: {
      tracks: {
        curent: {}
      }
    }
  };

因此,您将能够访问 tracks 内的 current 属性,而不会遇到 TypeError 。我制作了一个 codesandbox,因此您可以在那里查看 示例

如果这不能解决您的问题,请告诉我 ;)

maremarismaria
2022-03-08

您的调用看起来正确, 获取值的另一种方法是 console.log(liveInfo.tracks["current"]);

但我认为您的 tracks 在运行时没有值。也许您可以向我们展示更多调用 console.log 的代码。

也许您在语句中运行了两次,第一次它是未定义的并抛出错误。因此添加一个空检查,如下所示 console.log(liveInfo?.tracks?.current);

eifel
2022-03-08