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

bry*_*edy 7 mysql sequelize.js apollo graphql

我正在构建一个应用程序:

  • 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
}
Run Code Online (Sandbox Code Playgroud)

Sequelize连接器

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

GraphQL解析器:

Query: {
  person(_, args) {
    return Person.findById(args.id);
}
Run Code Online (Sandbox Code Playgroud)

这一切都有效.这是我的问题.GraphQL似乎将ID类型视为字符串.而ID值则作为INTSequelize 存储在MySQL数据库中.我可以使用GraphQL使用与数据库中的ID值匹配的字符串或整数来查询MySQL数据库.但是,GraphQL将始终将ID值作为字符串返回.

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

mar*_*ani 17

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

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


你的观察

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

结果强制的规范一致:

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

输入强制:

当预期作为输入类型时,任何字符串(例如"4")或整数(例如4)输入值都应该被强制转换为ID,以适合给定的GraphQL服务器期望的ID格式


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

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

一旦我从GraphQL获得它,我是否应该始终将其转换为整数?

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

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

不,那不是必需的.

关于该ID类型的GraphQL规范不包括如何存储 id,只包括GraphQL服务器如何处理ID输入和输出.由GraphQL层来确保这种行为.如何在实际存储中处理ID取决于存储层.

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

我希望上面的答案也回答这个问题:)

  • 这是对围绕这个问题的各种考虑的一个很好的解释。谢谢。GraphQL 提供了一种开放式的数据结构方法,很难找出**正确**的方式。 (3认同)
  • 我想说仅当它是字符串时才使用 ID 数据类型。尽管 GraphQL 文档说它与数据类型无关,但它显然更喜欢字符串。不可知论不会触及数据类型。 (3认同)