programing

릴레이에서 노드인터페이스와 글로벌 ID 사양은 어떤 역할을 합니까?

starjava 2023. 3. 28. 20:33
반응형

릴레이에서 노드인터페이스와 글로벌 ID 사양은 어떤 역할을 합니까?

저는 처음에relay-starter-kit릴레이 및 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],

아마도 그것과 관련이 있을 것이다.node필드 작업:

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

그리고 그 주변의 마법은 무엇일까?id필드? 필드란?globalIdField뭐에 대해서요?

나는 가지고 있다.idGraphQL 객체에서 사용할 수 있다고 생각했습니다.

대신:

id: globalIdField('User'),

데이터베이스 ID를 사용합니다.

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

하지만 그렇게 하면 브라우저에 다음과 같은 오류가 나타납니다.RelayQueryWriter: Could not find a type name for record '1'.

이 에러를 없애려면__typename내 컴포넌트 컨테이너 릴레이 쿼리에 연결되지만 모두 잘못된 것 같습니다.

여기서 좀 더 깊이 있는 내용과 더 나은 설명을 하고 공식 문서를 강화해 주셨으면 좋겠습니다.

감사해요.

Node루트 필드는 릴레이가 오브젝트를 재페치해야 할 때 글로벌 고유 ID와 조합하여 실행됩니다.콜할 때 재페치가 발생합니다.this.props.relay.forceFetch()또는 이미 부분적으로 가져오기 때문에 글로벌 ID가 알려진 객체의 쿼리에 필드를 추가하는 경우.

이러한 경우 릴레이는 일반 쿼리를 단락하고 자신의 글로벌 ID와 글로벌 ID를 사용하여 오브젝트에 대한 쿼리를 직접 실행합니다.node루트 콜

:

라고 가정합니다.$showComments이었다false이 쿼리가 처음 해결되었을 때.

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

이로 인해 에 대한 취득이 이루어졌을 것입니다.id그리고.text아이디가 알려진 몇 가지 사연에 대해서요

미래 어느 시점에 변수가$showComments되었다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 페어(globalIdFieldhelper는 이를 실행하여 base64 부호화 스트링을 생성합니다).
  2. 서버는 글로벌하게 고유한 ID에서 개체를 해결하는 방법을 알고 있어야 하며, 그 반대의 경우도 마찬가지입니다.이게 뭐냐면nodeDefinitions를 위한 것입니다.
  3. 이 시스템을 사용하여 재태칭할 수 있는 오브젝트는 모두nodeInterface.

참고 항목: https://relay.dev/docs/guides/graphql-server-specification/#object-identification

언급URL : https://stackoverflow.com/questions/33399901/in-relay-what-role-do-the-node-interface-and-the-global-id-spec-play

반응형