我应该在客户端将 GraphQL ID 作为字符串处理吗?

Should I handle a GraphQL ID as a string on the client?

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

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

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 总是 return 字符串形式的 ID 值。

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

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

The ID type is serialized in the same way as a String; however, it is not intended to be human‐readable. While it is often numeric, it should always serialize as a String.


你的观察

I can use GraphQL to query the MySQL db with either a string or a integer that matches the ID value in the database. However, GraphQL will always return the ID value as a string.

与关于 result coercion:

的规范一致

GraphQL is agnostic to ID format, and serializes to string to ensure consistency across many formats ID could represent

输入强制

When expected as an input type, any string (such as "4") or integer (such as 4) input value should be coerced to ID as appropriate for the ID formats a given GraphQL server expects


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

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

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

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

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

不,这不是必需的。

关于 ID 类型的 GraphQL 规范不涵盖您如何 存储 id,仅涵盖 GraphQL 服务器应如何处理 ID 输入和输出。由 GraphQL 层来确保此行为。 id在实际存储中如何处理取决于存储层。

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

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