reactjs-在中继中,节点接口和全局ID规范起什么作用?

我从__typename开始,还通过Relay和GraphQL文档进行工作。 但是有很多地方是无法解释和神秘的。

认真地,我到处都阅读了很多关于所有这些事情的文档,但是找不到以下问题的令人满意的解释:

这个是来做什么的? 我记录了日志,但是根本没有调用它:

var {nodeInterface, nodeField} = nodeDefinitions(
  (globalId) => {
    var {type, id} = fromGlobalId(globalId);
    if (type === 'User') {
      return getUser(id);
    } else if (type === 'Widget') {
      return getWidget(id);
    } else {
      return null;
    }
  },
  (obj) => {
    if (obj instanceof User) {
      return userType;
    } else if (obj instanceof Widget) {
      return widgetType;
    } else {
      return null;
    }
  }
);

实际的效果是什么?

interfaces: [nodeInterface],

也许与此有关,这里的__typename字段是做什么的:

var queryType = new GraphQLObjectType({
  name: 'Query',
  fields: () => ({
    node: nodeField,
    // Add your own root fields here
    viewer: {
      type: userType,
      resolve: () => getViewer(),
    },
  }),
});

__typename领域的魔力是什么? globalIdField是做什么用的?

我的数据库中有__typename,并认为可以在GraphQL对象中使用它:

代替:

id: globalIdField('User'),

我想使用我的数据库ID:

id: {
  type: GraphQLID,
  description: 'The identifier'
},

但是,如果这样做,我会在浏览器中看到__typename错误。

我可以通过将__typename添加到我的组件容器“中继查询”中来摆脱该错误,但这似乎是错误的。

如果您能在这里给出更深入的了解和更好的解释,并增强官方文档,那将是很好的。

谢谢

Christine asked 2020-01-22T15:19:45Z
1个解决方案
54 votes

当中继需要重新提取对象时,nodeInterface根字段与全局唯一ID结合使用。 当您调用true或将查询的字段添加到已知全局ID(因为已部分获取了该全局ID)的对象时,就会发生重新引用。

在这种情况下,Relay将短路常规查询,并直接使用其全局ID和nodeInterface根调用对对象执行查询。

例:

假定第一次解决此查询时,nodeInterfacetrue

query {
  viewer {
    stories(first: 10) {
      edges {
        node {
          id,
          comments(first: 10) @include(if: $showComments) { 
            author, 
            commentText 
          }
          text,
        }
      }
    }
  }
}

这将导致nodeInterfacetrue的某些故事的获取,这些故事的ID现在已知。

想象一下,在将来的某个时间,变量nodeInterface变为true。中继将使用node根字段仅重新获取所需的数据。

query {
  node(id: "ABC123") { 
    fragment on Story { comments(first: 10) { author, commentText } }
  }
  node(id: "DEF456") { 
    fragment on Story { comments(first: 10) { author, commentText } }
  }
  node(id: "GHI789") { 
    fragment on Story { comments(first: 10) { author, commentText } }
  }
  ...
}

这取决于几部分:

  1. 每个对象必须具有全局唯一的ID,或由一个类型/ ID对标识(nodeInterface帮助程序执行此操作并生成base64编码的字符串)。
  2. 服务器必须知道如何从全局唯一ID解析对象,反之亦然。 这就是nodeInterface的用途。
  3. 希望使用此系统可重新提取的任何对象都必须实现nodeInterface

另请参阅:[https://facebook.github.io/relay/docs/graphql-object-identification.html#content]

steveluscher answered 2020-01-22T15:20:57Z
translate from https://stackoverflow.com:/questions/33399901/in-relay-what-role-do-the-node-interface-and-the-global-id-spec-play