我正在使用以下方式构建应用程序:
在构建我的GraphQL架构时,我使用GraphQL ID数据类型来唯一地标识记录。这是一个示例模式及其MySQL解析器/连接器
Graphql类型:
type Person {
id: ID!
firstName: String
middleName: String
lastName: String
createdAt: String
updatedAt: String
}
Sequelize连接器
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时是否有正确的方法继续?
答案 0 :(得分:9)
ID
是GraphQL specification中描述的标量类型(2016年10月的工作草案):
ID类型以与String相同的方式序列化;但是,它并不是人类可读的。虽然它通常是数字,但它应该始终作为字符串序列化。
你的观察
我可以使用GraphQL使用与数据库中的ID值匹配的字符串或整数来查询MySQL数据库。但是,GraphQL将始终将ID值作为字符串返回。
与结果强制:
的规范保持一致GraphQL与ID格式无关,并且序列化为字符串以确保ID可以表示的多种格式的一致性
和输入强制:
当预期作为输入类型时,任何字符串(例如&#34; 4&#34;)或整数(例如4)输入值都应该被强制转换为ID,以适合给定的GraphQL服务器期望的ID格式< / p>
我应该如何在客户端处理此值?
ID
结果时,请将其视为字符串。ID
输入时(在GraphQL变量或输入参数中进行突变或查询),您可以使用整数或字符串。我是否应该在从GraphQL获取整数后立即将其转换为整数?
这取决于您的应用程序。没有一般规则可以规定一个明确的&#34;是&#34;或&#34;不&#34;这里。
我应该修改我的续集代码以将ID值存储为字符串吗?
不,这不是必需的。
关于ID
类型的GraphQL规范未涵盖存储 id的方式,仅涵盖GraphQL服务器如何处理ID
输入和输出。它可以通过GraphQL层来确保这种行为。如何在实际存储中处理ID取决于存储层。
使用像这样的GraphQL ID时是否有正确的方法?
我希望上面的答案也能回答这个问题:)