我正在生成一个应用程序,使用:
mysql作为后台数据库
Apollo GraphQL服务器作为该数据库的查询层
sequence作为graphql和mysql之间的orm层
在构建graphql模式时,我使用graphql id数据类型惟一地标识记录。下面是一个示例模式及其mysql解析器/连接器
图形类型:

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 },
});

图形解析程序:
Query: {
  person(_, args) {
    return Person.findById(args.id);
}

所以一切正常。这是我的问题。graphql似乎将ID类型视为字符串。而id值通过sequelize作为INT存储在mysql数据库中。我可以使用graphql查询mysql数据库,使用字符串或整数来匹配数据库中的id值。但是,graphql将始终以字符串形式返回id值。
我应该如何在客户机中处理这个值?我应该在从graphql中得到一个整数后立即将它转换成一个整数吗?我应该修改我的sequenceize代码以将id值存储为字符串吗?像这样使用graphql id时,是否有正确的方法继续?

最佳答案

IDGraphQL specification中描述的标量类型(2016年10月工作草案):
id类型的序列化方式与字符串的序列化方式相同;但是,它不打算是可读的。虽然它通常是数字,但它应该始终序列化为字符串。
你的观察
我可以使用graphql查询mysql数据库,使用字符串或整数来匹配数据库中的id值。但是,graphql将始终以字符串形式返回id值。
符合有关结果强制的规范:
graphql对id格式是不可知的,并序列化到字符串以确保id可以表示的许多格式之间的一致性。
输入强制:
当期望作为输入类型时,任何字符串(如“4”)或整数(如4)输入值都应强制为id,这与给定graphql服务器期望的id格式相适应
我应该如何在客户机中处理这个值?
当处理ID结果时,将它们视为字符串。
当使用ID输入(在graphql变量或用于突变或查询的输入参数中)时,可以使用整数或字符串。
我应该在从graphql中得到一个整数后立即将它转换成一个整数吗?
这在很大程度上取决于你的申请。在这里,没有任何一般规则明确规定“是”或“否”。
我应该修改我的sequenceize代码以将id值存储为字符串吗?
不,那不是必需的。
关于ID类型的graphql规范不包括如何存储id,只包括graphql服务器如何处理ID输入和输出。这取决于graphql层来确保这种行为。如何在实际存储中处理id取决于存储层。
像这样使用graphql id时,是否有正确的方法继续?
我希望以上答案也能回答这个问题:)

09-09 21:29
查看更多