9 मिनट
GraphQL Validations Migration Guide
जल्द ही ग्राफ़-नोड
[ग्राफ़क्यूएल सत्यापन विनिर्देश] (https://spec.graphql.org/June2018/#sec-Validation) के 100% कवरेज का समर्थन करेगा।
ग्राफ़-नोड
के पिछले संस्करण सभी सत्यापनों का समर्थन नहीं करते थे और अधिक सुंदर प्रतिक्रियाएँ प्रदान करते थे - इसलिए, अस्पष्टता के मामलों में, ग्राफ़-नोड
अमान्य ग्राफ़क्यूएल संचालन घटकों की अनदेखी कर रहा था।
ग्राफक्यूएल सत्यापन समर्थन आगामी नई सुविधाओं और ग्राफ नेटवर्क के पैमाने पर प्रदर्शन के लिए स्तंभ है।
यह क्वेरी प्रतिक्रियाओं के निर्धारण को भी सुनिश्चित करेगा, जो कि ग्राफ नेटवर्क पर एक प्रमुख आवश्यकता है।
GraphQL Validations को सक्षम करने से कुछ मौजूदा क्वेरीज़ टूट जाएंगी जो ग्राफ़ API को भेजी गई हैं।
उन मान्यताओं का अनुपालन करने के लिए, कृपया माइग्रेशन गाइड का पालन करें।
⚠️ यदि आप सत्यापन शुरू होने से पहले अपने प्रश्नों को माइग्रेट नहीं करते हैं, तो वे त्रुटियां लौटाएंगे और संभवत: आपके फ़्रंटएंड/क्लाइंट को तोड़ देंगे।
प्रवासन गाइड
आप अपने ग्राफक्यूएल संचालन में किसी भी समस्या का पता लगाने और उन्हें ठीक करने के लिए सीएलआई माइग्रेशन टूल का उपयोग कर सकते हैं। वैकल्पिक रूप से आप https://api-next.thegraph.com/subgraphs/name/$GITHUB_USER/$SUBGRAPH_NAME
समापन बिंदु का उपयोग करने के लिए अपने ग्राफ़िकल क्लाइंट के समापन बिंदु को अपडेट कर सकते हैं। इस समापन बिंदु के विरुद्ध अपने प्रश्नों का परीक्षण करने से आपको अपने प्रश्नों में समस्याओं का पता लगाने में मदद मिलेगी।
Not all Subgraphs will need to be migrated, if you are using GraphQL ESlint or GraphQL Code Generator, they already ensure that your queries are valid.
माइग्रेशन सीएलआई टूल
ज्यादातर ग्राफक्यूएल संचालन त्रुटियां समय से पहले आपके कोडबेस में पाई जा सकती हैं।
इस कारण से, हम विकास के दौरान या सीआई में आपके ग्राफक्यूएल संचालन को मान्य करने के लिए एक सहज अनुभव प्रदान करते हैं।
@graphql-validate/cli
एक सरल सीएलआई उपकरण है जो किसी दिए गए स्कीमा के खिलाफ ग्राफक्यूएल संचालन को मान्य करने में मदद करता है।
शुरू करना
आप टूल को निम्नानुसार चला सकते हैं:
1npx @graphql-validate/cli -s https://api-next.thegraph.com/subgraphs/name/$GITHUB_USER/$SUBGRAPH_NAME -o *.graphql
टिप्पणियाँ:
- $GITHUB_USER, $SUBGRAPH_NAME को उपयुक्त मानों के साथ सेट करें या बदलें। जैसे:
artblocks/art-blocks
- प्रदान किया गया पूर्वावलोकन स्कीमा URL (https://api-next.thegraph.com/) अत्यधिक दर-सीमित है और एक बार सभी उपयोगकर्ताओं के नए संस्करण में माइग्रेट हो जाने के बाद समाप्त हो जाएगा। उत्पादन में इसका उपयोग न करें।
- निम्नलिखित एक्सटेंशन वाली फाइलों में संचालन की पहचान की जाती है
.graphql
,.ts
,.tsx
,.js
,jsx
(-o
विकल्प)।
सीएलआई आउटपुट
[@graphql-validate/cli](https://github.com/saihaj/graphql-validate)
सीएलआई टूल किसी भी ग्राफक्यूएल संचालन त्रुटियों को निम्नानुसार आउटपुट करेगा:

प्रत्येक त्रुटि के लिए, आपको विवरण, फ़ाइल पथ और स्थिति, और समाधान उदाहरण के लिए एक लिंक मिलेगा (निम्न अनुभाग देखें)।
अपने स्थानीय प्रश्नों को पूर्वावलोकन स्कीमा के विरुद्ध चलाएँ
We provide an endpoint https://api-next.thegraph.com/
that runs a graph-node
version that has validations turned on.
आप उन्हें भेजकर प्रश्नों को आज़मा सकते हैं:
https://api-next.thegraph.com/subgraphs/id/<Qm...>
या
https://api-next.thegraph.com/subgraphs/name/<GITHUB_USER>/<SUBGRAPH_NAME>
उन प्रश्नों पर काम करने के लिए जिन्हें सत्यापन त्रुटियों के रूप में फ़्लैग किया गया है, आप Altair या GraphiQL जैसे अपने पसंदीदा ग्राफ़क्यूएल क्वेरी टूल का उपयोग कर सकते हैं, और अपनी क्वेरी को आज़मा सकते हैं। वे उपकरण आपके चलाने से पहले ही उन त्रुटियों को उनके UI में चिह्नित कर देंगे।
मुद्दों को कैसे हल करें
नीचे, आपको वे सभी ग्राफ़िकल सत्यापन त्रुटियां मिलेंगी जो आपके मौजूदा ग्राफ़िकल ऑपरेशंस पर हो सकती हैं।
ग्राफक्यूएल चर, संचालन, टुकड़े या तर्क अद्वितीय होने चाहिए
हमने यह सुनिश्चित करने के लिए नियम लागू किए हैं कि एक ऑपरेशन में ग्राफक्यूएल चर, संचालन, टुकड़े और तर्कों का एक अनूठा सेट शामिल है।
एक ग्राफकॉल ऑपरेशन तभी मान्य होता है जब उसमें कोई अस्पष्टता न हो।
इसे प्राप्त करने के लिए, हमें यह सुनिश्चित करने की आवश्यकता है कि आपके ग्राफकॉल ऑपरेशन में कुछ घटक अद्वितीय होने चाहिए।
इन नियमों का उल्लंघन करने वाली कुछ अमान्य कार्रवाइयों का उदाहरण यहां दिया गया है:
Duplicate Query name (#UniqueOperationNamesRule)
1# The following operation violated the UniqueOperationName2# rule, since we have a single operation with 2 queries3# with the same name4query myData {5 id6}78query myData {9 name10}
Solution:
1query myData {2 id3}45query myData2 {6 # rename the second query7 name8}
Duplicate Fragment name (#UniqueFragmentNamesRule)
1# The following operation violated the UniqueFragmentName2# rule.3query myData {4 id5 ...MyFields6}78fragment MyFields {9 metadata10}1112fragment MyFields {13 name14}
Solution:
1query myData {2 id3 ...MyFieldsName4 ...MyFieldsMetadata5}67fragment MyFieldsMetadata { # assign a unique name to fragment8 metadata9}1011fragment MyFieldsName { # assign a unique name to fragment12 name13}
Duplicate variable name (#UniqueVariableNamesRule)
1# The following operation violates the UniqueVariables2query myData($id: String, $id: Int) {3 id4 ...MyFields5}
Solution:
1query myData($id: String) {2 # keep the relevant variable (here: `$id: String`)3 id4 ...MyFields5}
Duplicate argument name (#UniqueArgument)
1# The following operation violated the UniqueArguments2query myData($id: ID!) {3 userById(id: $id, id: "1") {4 id5 }6}
Solution:
1query myData($id: ID!) {2 userById(id: $id) {3 id4 }5}
Duplicate anonymous query (#LoneAnonymousOperationRule)
Also, using two anonymous operations will violate the LoneAnonymousOperation
rule due to conflict in the response structure:
1# This will fail if executed together in2# a single operation with the following two queries:3query {4 someField5}67query {8 otherField9}
Solution:
1query {2 someField3 otherField4}
Or name the two queries:
1query FirstQuery {2 someField3}45query SecondQuery {6 otherField7}
ओवरलैपिंग फील्ड्स
एक ग्राफक्यूएल चयन सेट को तभी वैध माना जाता है जब वह अंतिम परिणाम सेट को सही ढंग से हल करता है।
यदि कोई विशिष्ट चयन सेट, या कोई फ़ील्ड, चयनित फ़ील्ड या उपयोग किए गए तर्कों द्वारा अस्पष्टता बनाता है, तो ग्राफ़कॉल सेवा ऑपरेशन को मान्य करने में विफल हो जाएगी।
इस नियम का उल्लंघन करने वाली अमान्य कार्रवाइयों के कुछ उदाहरण यहां दिए गए हैं:
Conflicting fields aliases (#OverlappingFieldsCanBeMergedRule)
1# Aliasing fields might cause conflicts, either with2# other aliases or other fields that exist on the3# GraphQL schema.4query {5 dogs {6 name: nickname7 name8 }9}
Solution:
1query {2 dogs {3 name: nickname4 originalName: name # alias the original `name` field5 }6}
Conflicting fields with arguments (#OverlappingFieldsCanBeMergedRule)
1# Different arguments might lead to different data,2# so we can't assume the fields will be the same.3query {4 dogs {5 doesKnowCommand(dogCommand: SIT)6 doesKnowCommand(dogCommand: HEEL)7 }8}
Solution:
1query {2 dogs {3 knowsHowToSit: doesKnowCommand(dogCommand: SIT)4 knowsHowToHeel: doesKnowCommand(dogCommand: HEEL)5 }6}
साथ ही, अधिक जटिल उपयोग-मामले में, आप दो टुकड़ों का उपयोग करके इस नियम का उल्लंघन कर सकते हैं जो अंततः अपेक्षित सेट में विरोध का कारण बन सकता है:
1query {2 # Eventually, we have two "x" definitions, pointing3 # to different fields!4 ...A5 ...B6}78fragment A on Type {9 x: a10}1112fragment B on Type {13 x: b14}
In addition to that, client-side GraphQL directives like @skip
and @include
might lead to ambiguity, for example:
1fragment mergeSameFieldsWithSameDirectives on Dog {2 name @include(if: true)3 name @include(if: false)4}
एल्गोरिथ्म के बारे में आप यहां और पढ़ सकते हैं।
अप्रयुक्त चर या टुकड़े
एक ग्राफक्यूएल ऑपरेशन को भी केवल तभी वैध माना जाता है जब सभी ऑपरेशन-परिभाषित घटकों (चर, टुकड़े) का उपयोग किया जाता है।
इन नियमों का उल्लंघन करने वाले ग्राफ़िकल ऑपरेशंस के कुछ उदाहरण यहां दिए गए हैं:
Unused variable (#NoUnusedVariablesRule)
1# Invalid, because $someVar is never used.2query something($someVar: String) {3 someData4}
Solution:
1query something {2 someData3}
Unused Fragment (#NoUnusedFragmentsRule)
1# Invalid, because fragment AllFields is never used.2query something {3 someData4}56fragment AllFields { # unused :(7 name8 age9}
Solution:
1No translations matched your search2# Invalid, because fragment AllFields is never used.3query something {4 someData5}67# remove the `AllFields` fragment
Invalid or missing Selection-Set (#ScalarLeafsRule)
इसके अलावा, एक ग्राफक्यूएल फ़ील्ड चयन केवल तभी मान्य होता है जब निम्नलिखित मान्य हो:
- ऑब्जेक्ट फ़ील्ड में चयन सेट निर्दिष्ट होना चाहिए।
- एक एज फ़ील्ड (स्केलर, एनम) में निर्दिष्ट चयन सेट नहीं होना चाहिए।
निम्नलिखित स्कीमा के साथ इन नियमों के उल्लंघन के कुछ उदाहरण यहां दिए गए हैं:
1type Image {2 url: String!3}45type User {6 id: ID!7 avatar: Image!8}910type Query {11 user: User!12}
Invalid Selection-Set
1query {2 user {3 id { # Invalid, because "id" is of type ID and does not have sub-fields45 }6 }7}
Solution:
1query {2 user {3 id4 }5}
Missing Selection-Set
1query {2 user {3 id4 image # `image` requires a Selection-Set for sub-fields!5 }6}
Solution:
1query {2 user {3 id4 image {5 src6 }7 }8}
Incorrect Arguments values (#VariablesInAllowedPositionRule)
स्कीमा में परिभाषित मान के आधार पर तर्कों के लिए हार्ड-कोडेड मानों को पास करने वाले ग्राफ़िकल ऑपरेशंस को मान्य होना चाहिए।
यहां इन नियमों का उल्लंघन करने वाली अमान्य कार्रवाइयों के कुछ उदाहरण दिए गए हैं:
1query purposes {2 # If "name" is defined as "String" in the schema,3 # this query will fail during validation.4 purpose(name: 1) {5 id6 }7}89# This might also happen when an incorrect variable is defined:1011query purposes($name: Int!) {12 # If "name" is defined as `String` in the schema,13 # this query will fail during validation, because the14 # variable used is of type `Int`15 purpose(name: $name) {16 id17 }18}
Unknown Type, Variable, Fragment, or Directive (#UnknownX)
यदि किसी अज्ञात प्रकार, चर, खंड या निर्देश का उपयोग किया जाता है, तो ग्राफकलाइन एपीआई एक त्रुटि उत्पन्न करेगा।
उन अज्ञात संदर्भों को ठीक किया जाना चाहिए:
- नाम बदलें अगर यह एक टाइपो था
- अन्यथा हटा दें
फ़्रैगमेंट: अमान्य फैलाव या परिभाषा
Invalid Fragment spread (#PossibleFragmentSpreadsRule)
एक फ़्रैगमेंट को गैर-लागू प्रकार पर नहीं फैलाया जा सकता है।
Example, we cannot apply a Cat
fragment to the Dog
type:
1query {2 dog {3 ...CatSimple4 }5}67fragment CatSimple on Cat {8 # ...9}
Invalid Fragment definition (#FragmentsOnCompositeTypesRule)
सभी फ़्रैगमेंट को परिभाषित किया जाना चाहिए (on ...
का उपयोग करके) एक समग्र प्रकार, संक्षेप में: ऑब्जेक्ट, इंटरफ़ेस, या यूनियन।
निम्नलिखित उदाहरण अमान्य हैं, क्योंकि स्केलर्स पर अंशों को परिभाषित करना अमान्य है।
1fragment fragOnScalar on Int {2 # we cannot define a fragment upon a scalar (`Int`)3 something4}56fragment inlineFragOnScalar on Dog {7 ... on Boolean {8 # `Boolean` is not a subtype of `Dog`9 somethingElse10 }11}
Directives usage
Directive cannot be used at this location (#KnownDirectivesRule)
Only GraphQL directives (@...
) supported by The Graph API can be used.
यहाँ द ग्राफक्यूएल समर्थित निर्देशों के साथ एक उदाहरण दिया गया है:
1query {2 dog {3 name @include(true)4 age @skip(true)5 }6}
Note: @stream
, @live
, @defer
are not supported.
Directive can only be used once at this location (#UniqueDirectivesPerLocationRule)
ग्राफ़ द्वारा समर्थित निर्देश प्रति स्थान केवल एक बार उपयोग किए जा सकते हैं।
The following is invalid (and redundant):
1query {2 dog {3 name @include(true) @include(true)4 }5}