如何在 graphql 上正确创建 Id 字段以符合中继标准?

Posted

技术标签:

【中文标题】如何在 graphql 上正确创建 Id 字段以符合中继标准?【英文标题】:How to properly create the Id field on a graphql to be relay compliant? 【发布时间】:2017-08-18 13:02:34 【问题描述】:

我正在关注relay+graphql 教程,但我对这段代码感到困惑:

const GraphQLTodo = new GraphQLObjectType(
  name: 'Todo',
  fields: 
    id: globalIdField('Todo'),
    text: 
      type: GraphQLString,
      resolve: (obj) => obj.text, 
    ,
    complete: 
      type: GraphQLBoolean,
      resolve: (obj) => obj.complete,
    ,
  ,
  interfaces: [nodeInterface],
);

关于文本和完整字段的解析,obj来自哪里?是查询中的 obj 参数吗?还有,我如何从查询中解析 id ?难道我不必解决它?例如,这是 id 字段代码:

id: 
  id: globalIdField('Todo'),
  resolve: (obj) => obj.id, 

上面的代码会起作用吗?它不是多余的吗?如何正确创建 Id 字段以符合中继标准?

【问题讨论】:

【参考方案1】:

obj 是记录本身,通常是您从持久存储中获得的任何格式。在本例中,它是一个Todo 对象,至少具有两个属性:textcomplete。这使得解析函数变得微不足道。存在解析函数,因此您可以执行更复杂的操作,例如:

fullName: 
  type: GraphQLString,
  resolve: (obj) => obj.firstName + ' ' + obj.surname,

对于符合 Relay 的 ID,我认为您无需执行任何操作。 globalIdField 帮你搞定。

【讨论】:

持久存储是什么意思?数据库? 是的,数据库(SQL 或其他)通常是存储数据的地方。在一些 GraphQL 教程中,我看到它被简化为没有持久性的内存数据结构。不过,这通常只是对教程的简化。 感谢您的时间和解释,帮助很大。

以上是关于如何在 graphql 上正确创建 Id 字段以符合中继标准?的主要内容,如果未能解决你的问题,请参考以下文章

对 Type-graphql 和 Typeorm 实体中的外键字段使用 ID 标量类型在语义上是不是正确?

如何调整超级视图的大小以符合子视图约束

如何使用 GraphQL 上的自定义字段查询?

在 graphQL 中更新模型,提供要更新的字段和 id 数组

石墨烯突变返回 400 - 不会正确传递 id 字段

带有官方 Graphql 教程的“无法在 CreateUser 类型上查询字段 'id'”