Graphql ID解析为字符串,即使它是';s整数

Graphql ID解析为字符串,即使它是';s整数,graphql,Graphql,我是graphql新手,希望有人能向我解释这种ID类型总是字符串 正如文件中所说: ID标量类型表示唯一标识符,通常用于重新获取对象或作为缓存的键 例如,如果使用Apollo之类的缓存客户端,则每种类型 应该至少有一个ID。这允许我们执行规范化 查询,使我们能够更新阿波罗中的内容 基于唯一id自动执行内部redux存储 好的,所以我可以使用int,但是如何在客户端将我的id作为整数呢 原因很简单,假设我有id为type id的Book type和id为type Int的author\u id关系

我是graphql新手,希望有人能向我解释这种ID类型总是字符串

正如文件中所说:

ID标量类型表示唯一标识符,通常用于重新获取对象或作为缓存的键

例如,如果使用Apollo之类的缓存客户端,则每种类型 应该至少有一个ID。这允许我们执行规范化 查询,使我们能够更新阿波罗中的内容 基于唯一id自动执行内部redux存储

好的,所以我可以使用int,但是如何在客户端将我的id作为整数呢

原因很简单,假设我有id为type id的Book type和id为type Int的author\u id关系。我也有id为type id的author type。在我取出Book和author之后,我将有Book.author\u id Int和author.id字符串,但它是相同的数字

我该怎么办?在任何地方使用ID,甚至用于多对多关系?创建新的标量ID类型,该类型可以用作重新获取的ID,但类型为Int?

来自:

ID类型以与字符串相同的方式序列化;但是,它不是为了让人可读。虽然它通常是数字的,但应该始终序列化为字符串。。。GraphQL与ID格式无关,并序列化为字符串以确保ID可以表示的多种格式的一致性,从小的自动递增数字到大的128位随机数,再到base64编码值,或GUID等格式的字符串值

不清楚客户机为什么会关心在这种上下文中比较id——像
author\u id
这样的列通常应该对客户机隐藏,模式只公开相关的实体,而不是只用于链接实体的字段。也就是说,一个ID就是一个ID,只要它是一致的,客户端就不应该关心它是字符串还是整数。如果有一个字段返回整数(Book.author\u id),另一个字段返回字符串(author.id),那么这就是架构部分的问题

ID标量可以用于任意数量的字段,而不仅仅是一个字段(可以命名为
ID
)。类似地,如果您想使用Int或String作为
id
字段的类型,您可以--这不会影响Apollo缓存结果的能力。

来自:

ID类型以与字符串相同的方式序列化;但是,它不是为了让人可读。虽然它通常是数字的,但应该始终序列化为字符串。。。GraphQL与ID格式无关,并序列化为字符串以确保ID可以表示的多种格式的一致性,从小的自动递增数字到大的128位随机数,再到base64编码值,或GUID等格式的字符串值

不清楚客户机为什么会关心在这种上下文中比较id——像
author\u id
这样的列通常应该对客户机隐藏,模式只公开相关的实体,而不是只用于链接实体的字段。也就是说,一个ID就是一个ID,只要它是一致的,客户端就不应该关心它是字符串还是整数。如果有一个字段返回整数(Book.author\u id),另一个字段返回字符串(author.id),那么这就是架构部分的问题


ID标量可以用于任意数量的字段,而不仅仅是一个字段(可以命名为
ID
)。类似地,如果您想使用Int或String作为
id
字段的类型,您可以--这不会影响Apollo缓存结果的能力。

在Apollo中,您可以使用TypePolicys来确定将哪个字段用作唯一标识符。这将解决身份的痛苦!类型转换为字符串

const typePolicies = {
  Book: {
    keyFields: ['id'],
  },  
  BookTag: {
    keyFields: ['book_id', 'tag_id'],
  }
}

  return new ApolloClient({
    cache: new InMemoryCache({ typePolicies }),
  })

在apollo中,您可以使用TypePolicys来确定哪个字段用作唯一标识符。这将解决身份的痛苦!类型转换为字符串

const typePolicies = {
  Book: {
    keyFields: ['id'],
  },  
  BookTag: {
    keyFields: ['book_id', 'tag_id'],
  }
}

  return new ApolloClient({
    cache: new InMemoryCache({ typePolicies }),
  })

这似乎不是来自任何官方文件,只是一些文章。这是一个老版本,因为Apollo客户端从2.0版开始就没有使用redux。这似乎不是来自任何官方文档,只是一些文章。自从Apollo客户端从2.0版开始就没有使用redux,这是一个老版本。隐藏是什么意思?Id是客户端组件渲染和比较的头号道具。一本书应该有一个
Id
字段,但通常没有理由公开
作者Id
字段。它应该只公开一个返回author对象的
author
字段
author\u id
是一个实现细节——它与服务器相关,因为这是加载相关实体的方式,但它可能与客户端无关。@RTW重新阅读您的问题,我意识到您可能一直在问,当id标量用作参数等输入时,它们是如何解析的。如果是这种情况,请记住,如果您的数据库驱动程序/查询生成器/ORM需要一个整数作为参数,并且由于使用了ID标量而在解析器中得到一个字符串参数,那么您始终可以调用
parseInt
。隐藏是什么意思?Id是客户端组件渲染和比较的头号道具。一本书应该有一个
Id
字段,但通常没有理由公开
作者Id
字段。它应该只公开一个返回author对象的
author
字段
author\u id
是一个实现细节——它与服务器相关,因为这是加载相关实体的方式,但它可能与客户端无关。@RTW重新阅读您的问题,我意识到您可能一直在问,当id标量用作参数等输入时,它们是如何解析的。如果是这种情况,那么请记住,如果数据库驱动程序/查询生成器/ORM需要一个整数作为参数,并且由于使用了ID标量而在解析器中得到一个字符串参数,则始终可以调用
par