【问题标题】:Should I handle a GraphQL ID as a string on the client?我应该在客户端将 GraphQL ID 作为字符串处理吗?
【发布时间】:2018-06-01 03:26:02
【问题描述】:

我正在使用以下方式构建应用程序:

  • MySQL 作为后端数据库
  • Apollo GraphQL 服务器作为该数据库的查询层
  • Sequelize 作为 GraphQL 和 MySQL 之间的 ORM 层

在构建 GraphQL 架构时,我使用 GraphQL ID 数据类型来唯一标识记录。这是一个示例模式及其 MySQL 解析器/连接器

Graphql 类型:

type Person {
  id: ID!
  firstName: String
  middleName: String
  lastName: String
  createdAt: String
  updatedAt: String
}

续集连接器

export const Person = sequelize.define('person', {
  firstName: { type: Sequelize.STRING },
  middleName: { type: Sequelize.STRING },
  lastName: { type: Sequelize.STRING },
});

GraphQL 解析器:

Query: {
  person(_, args) {
    return Person.findById(args.id);
}

所以一切正常。这是我的问题。 GraphQL 似乎将ID 类型视为字符串。虽然 ID 值通过 Sequelize 以 INT 的形式存储在 MySQL 数据库中。我可以使用 GraphQL 使用与数据库中的 ID 值匹配的字符串或整数来查询 MySQL 数据库。但是,GraphQL 将始终将 ID 值作为字符串返回。

我应该如何在客户端处理这个值?从 GraphQL 获取它后,我是否应该始终将其转换为整数?我应该修改我的续集代码以将 ID 值存储为字符串吗?像这样使用 GraphQL ID 时有正确的方法吗?

【问题讨论】:

    标签: mysql sequelize.js graphql apollo


    【解决方案1】:

    IDGraphQL specification(2016 年 10 月工作草案)中描述的标量类型:

    ID类型的序列化方式与String相同;但是,它并不适合人类阅读。虽然它通常是数字,但它应该始终序列化为字符串。


    你的观察

    我可以使用 GraphQL 使用与数据库中的 ID 值匹配的字符串或整数来查询 MySQL 数据库。但是,GraphQL 将始终将 ID 值作为字符串返回。

    结果强制的规范一致:

    GraphQL 与 ID 格式无关,并序列化为字符串以确保 ID 可以表示的多种格式的一致性

    输入强制

    当期望作为输入类型时,任何字符串(例如“4”)或整数(例如 4)输入值都应根据给定 GraphQL 服务器期望的 ID 格式强制转换为 ID


    我应该如何在客户端处理这个值?

    • 使用ID 结果时,将它们视为字符串。
    • 使用ID输入(在 GraphQL 变量或突变或查询的输入参数中)时,您可以使用整数或字符串。

    我是否应该在从 GraphQL 获得整数后立即将其转换为整数?

    这在很大程度上取决于您的应用程序。这里没有明确规定“是”或“否”的一般规则。

    我应该修改我的 sequelize 代码以将 ID 值存储为字符串吗?

    不,这不是必需的。

    关于 ID 类型的 GraphQL 规范并未涵盖您存储 id 的方式,仅涉及 GraphQL 服务器应如何处理 ID 输入和输出。由 GraphQL 层来确保这种行为。实际存储中如何处理 id 取决于存储层。

    在使用这样的 GraphQL ID 时是否有正确的方法?

    我希望以上答案也能回答这个问题:)

    【讨论】:

    • 这很好地解释了围绕这个问题的各种考虑。谢谢。 GraphQL 为数据结构提供了一种开放式的方法,因此很难找出正确的方法。
    • 我可以只使用 Int 而不是 mysql 主列的 ID 类型吗? React apollo 已经允许自定义函数“dataObjectId”设置对象 ID。为主键设置 ID 标量类型似乎没有任何好处。
    • ...it is not intended to be human‐readable 是什么意思?只要长度超过边界,任何内容都是可读的。
    • human-readable text 是指熟悉文本所用语言的人可以轻松阅读和理解的自然语言文本。与machine-readable 文本相反,它可以很容易地被计算机处理。例如,对字符串使用拉丁字母比使用机器可读的 ASCII 码更易于人类阅读。
    • 我会说只有当它是一个字符串时才使用 ID 数据类型。尽管 GraphQL 文档说它与数据类型无关,但它显然更喜欢字符串。不可知论者不会触及数据类型。
    猜你喜欢
    • 1970-01-01
    • 2011-07-22
    • 2018-03-30
    • 1970-01-01
    • 2021-10-12
    • 2021-12-08
    • 1970-01-01
    • 2021-06-26
    相关资源
    最近更新 更多