【问题标题】:"Cannot read properties of undefined," even though data is there (React/JSX)“无法读取未定义的属性”,即使存在数据(React/JSX)
【发布时间】:2022-01-06 17:30:59
【问题描述】:

我需要映射用户保存的一系列小说,以便在每部小说上呈现信息卡。每次我尝试时,页面都无法加载,并且我得到“TypeError:无法读取 null 的属性(正在读取'名称')--尝试读取小说的名称等。查询在后端完美运行,我能够控制台记录浏览器中的所有数据,所以我不确定为什么会出现“未定义”。

我发现我能够从用户级别呈现数据,但不能从“小说”子级别呈现数据。所以我认为问题可能与映射有关?

这里是查询:

{
  user {
    _id
    name
    novels {
      _id
      name
      author
      rank
      isComplete
    }
  }
}

以及组件中的相关代码:

    if (data) {
        user = data.user

        console.log(user.novels)
    }
return (
        <>
                <div className="row">
                    {user ? (
                        <>
                            <h2>Your Novels:</h2>
                            {user.novels.map((novel) => (
                                <div
                                    key={novel._id}
                                    className="col-sm-12 col-md-2 col-lg-2 card">
                                    <p>  {novel.name}
                                        < br />
                                        <span className="card-subheader" >by</span> {novel.author}
                                        < br />
                                        <span className="card-subheader">Rank:</span> {novel.rank}
                                        < br />
                                        <span key={novel.isComplete}>{novel.isComplete}</span>
                                    </p>
                                </div>
                            ))}
                        ) : null}
                </div>
        </>
    );
}

所以基本上,它可以渲染user.name,但不能渲染user.novel.name

任何帮助将不胜感激! (这是我的第一篇文章,如果我遗漏了什么,请提前道歉)

【问题讨论】:

  • console.log(user) 给了什么?只是为了验证user.novels 是数组还是对象
  • 所以实际上user.novels 是一个对象数组:15: {__typename: 'Novel', _id: '61bb535508015458de004f27', name: 'Catch-22', author: 'Joseph Heller', rank: '9', …}

标签: javascript reactjs mongodb graphql jsx


【解决方案1】:

看来这不是前端代码的错。您应该在console 中检查user。可能user.novels 包含一个空对象导致读取novel.name 时出错,如下所示:

{
  user: {
    _id: ...
    name: ...
    novels: [
      null or {}, // novel is null so reading novel.name cause the error. 
      {
        _id: ...
        name: ...
        author: ...
        rank: ...
        isComplete: ...
      }
    ],
    ...
  }
}

但是,您可以在前端进行检查,但从技术上讲,这些空对象不应该出现在后端的响应中,应该修复它们。

【讨论】:

  • 我不同意“从技术上讲,这些空对象不应该出现在您来自后端的响应中”的说法。这取决于 GraphQL 模式。如果novels 是可空对象的列表,则列表中的空对象是完全有效的。我敢打赌novels 列表确实是一个可空对象列表,否则 GraphQL 引擎在尝试将null 序列化为“新”对象时很可能会抛出错误
  • 就是这样!我为小说设置了不可为空的 ID,但是在我之前在 graphql 操场上不太成功的日子里,收藏中隐藏了一些空值。谢谢!
  • @AshleyTate 如果此答案对您有所帮助,请将其标记为已接受。
  • @EricDauenhauer 这就是重点!
猜你喜欢
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
  • 2019-05-19
  • 2020-06-20
  • 2017-01-18
  • 1970-01-01
  • 2020-08-13
  • 2019-04-09
相关资源
最近更新 更多