使用 GraphQL 进行请求时,遇到 “Cannot read property ‘xxx’ of undefined” 怎么办?

阅读时长 5 分钟读完

GraphQL 可以让前端开发者更高效地请求数据,并且可以方便地处理多个数据源。然而,在使用 GraphQL 进行请求时,有时可能会遇到 "Cannot read property ‘xxx’ of undefined” 的错误提示信息。这个错误通常是由于 GraphQL 查询的返回数据中缺失了某些属性导致的。接下来本文将详细介绍这个问题的解决方法以及相关的深入学习内容。

问题分析

GraphQL 查询的请求过程是异步的。如果查询中某些属性未被返回,那么它们会在返回结果中被赋值为 undefined。如果后续的代码尝试访问这些 undefined 属性,就会报错并且提示 “Cannot read property ‘xxx’ of undefined” 。

例如,下面的 GraphQL 查询请求是获取文章的相关信息:

-- -------------------- ---- -------
----- -
  ----------- ---- -
    --
    -----
    ------ -
      ----
      -----
    -
  -
-

如果文章的作者信息未被返回,那么在访问 author.name 或 author.email 属性时会出现 "Cannot read property ‘name/email’ of undefined" 的错误。因此,我们需要对 undefined 值进行判断和处理,以避免这种错误的发生。

解决方法

在 GraphQL 返回的数据中判断某些属性是否包含 undefined 值,有两种典型的处理方法:使用 lodash 提供的 get 函数进行安全访问,或者使用 TypeScript 等类型检查工具。

方法一:使用 get 函数进行安全访问

lodash 是一个提供实用工具函数的 JavaScript 库,其中的 get 函数可以在对象不存在某个属性时返回 undefined,而不是报错。如果我们想要获取某个嵌套属性但是不确定它是否存在,可以使用 get 方法。

示例代码:

-- -------------------- ---- -------
------ - ---- ---------

----- ---- - -
  -------- -
    --- ----
    ------ -------- -- ----------
    ------- ----
  -
-

----- ---------- - ----------- ---------------------- ---- -- ------------------ --- --

在这个示例中,使用 lodash 提供的 get 函数获取 author.name 属性值,如果 author 或者 author.name 属性不存在,将会返回空字符串。我们可以使用这个方法对 GraphQL 返回的查询结果进行安全访问,以避免 "Cannot read property ‘xxx’ of undefined" 的错误发生。

方法二:使用 TypeScript 进行类型检查

与 JavaScript 不同,TypeScript 是一种支持静态类型和类型推断的编程语言。使用 TypeScript 可以帮助我们在编码过程中发现潜在的错误,并且可以提供更好的代码补全、类型注释等功能。在 GraphQL 中,使用 TypeScript 可以更加准确地描述查询返回的数据类型,从而在编写代码时规避 undefined 值导致的错误。

示例代码:

-- -------------------- ---- -------
--------- ------ -
  ----- -------
  ------ -------
-

--------- ------- -
  --- -------
  ------ -------
  ------- ------ - -----
-

----- ----- ------- - -
  --- ----
  ------ -------- -- ----------
  ------- ----
--

----- ---------- - ------------------ -- -- ------ - ---- ------------ --- ---------

在这个示例中,我们定义了 Article 和 Author 两个接口类型,并将它们用于描述 GraphQL 返回的数据结构。如果查询返回的数据结构不符合我们的描述,TypeScript 将会在编译期间给出错误提示,并帮助我们规避 undefined 值的错误。在访问 author.name 属性时,使用 ?. 操作符可以安全地规避 author 为 null 的情况,从而避免了 "Cannot read property ‘name’ of undefined" 的错误发生。

总结

使用 GraphQL 进行请求时,遇到 "Cannot read property ‘xxx’ of undefined" 的错误提示通常都是由于返回的数据对象中缺失某些属性导致的。应对这个问题有两种解决方法:一是使用 lodash 提供的 get 函数进行安全访问;二是使用 TypeScript 进行类型检查。这些方法都可以帮助我们在编写代码时避免 undefined 值导致的错误,提高代码的稳定性和可靠性。

本文只是对 GraphQL 中的一个问题进行了简要介绍,如果你想深入了解 GraphQL 的使用和进阶技巧,可以从下面的资源中进行学习。

学习资源

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64fa67c5f6b2d6eab3165a4e

纠错
反馈