릴레이에서 노드인터페이스와 글로벌 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
뭐에 대해서요?
나는 가지고 있다.id
GraphQL 객체에서 사용할 수 있다고 생각했습니다.
대신:
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 } }
}
...
}
이는 몇 가지 요소에 따라 달라집니다.
- 각 개체는 글로벌하게 고유한 ID를 가지거나 유형으로 식별되어야 합니다.ID 페어(
globalIdField
helper는 이를 실행하여 base64 부호화 스트링을 생성합니다). - 서버는 글로벌하게 고유한 ID에서 개체를 해결하는 방법을 알고 있어야 하며, 그 반대의 경우도 마찬가지입니다.이게 뭐냐면
nodeDefinitions
를 위한 것입니다. - 이 시스템을 사용하여 재태칭할 수 있는 오브젝트는 모두
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
'programing' 카테고리의 다른 글
각도에서의 "href"와 "ng-href"의 차이JS (0) | 2023.03.28 |
---|---|
리액트 메모는 언제 사용하면 안 되나요? (0) | 2023.03.28 |
ContentCachingResponseWrapper가 빈 응답을 생성함 (0) | 2023.03.28 |
Node.js/Express의 모든 요청을 로깅하고 있습니다. (0) | 2023.03.28 |
화살표 본문을 둘러싼 예기치 않은 블록 문 (0) | 2023.03.28 |