7 minutes
GraphQL Validations Migration Guide
Brzy bude graph-node
podporovat 100% pokrytí GraphQL Validations specifikace.
Předchozí verze graph-node
nepodporovaly všechny validace a neposkytovaly šetrnější odpovědi - v případě nejednoznačnosti tak graph-node
ignoroval neplatné komponenty operací GraphQL.
Podpora ověřování GraphQL je pilířem pro nadcházející nové funkce a výkon v měřítku Síť Graph.
Zajistí také determinismus odpovědí na dotazy, což je klíčový požadavek sítě Graf.
Povolení ověřování GraphQL naruší některé existující dotazy odeslané do Grafu API.
Chcete-li být v souladu s těmito validacemi, postupujte podle průvodce migrací.
⚠️ Pokud neprovedete migraci dotazů před zavedením validací, budou vracet chyby a možná rozbijí vaše frontends/klienty.
Průvodce migrací
Pomocí migračního nástroje CLI můžete najít případné problémy v operacích GraphQL a opravit je. Případně můžete aktualizovat koncový bod svého klienta GraphQL tak, aby používal koncový bod https://api-next.thegraph.com/subgraphs/name/$GITHUB_USER/$SUBGRAPH_NAME
. Testování dotazů proti tomuto koncovému bodu vám pomůže najít problémy ve vašich dotazech.
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.
Migrační nástroj CLI
Většinu chyb při operacích GraphQL můžete najít ve své kódové základně předem.
Z tohoto důvodu poskytujeme hladký průběh ověřování operací GraphQL během vývoje nebo v CI.
@graphql-validate/cli
je jednoduchý nástroj CLI, který pomáhá ověřovat operace GraphQL proti danému schéma.
začínáme
Nástroj můžete spustit následujícím způsobem:
1npx @graphql-validate/cli -s https://api-next.thegraph.com/subgraphs/name/$GITHUB_USER/$SUBGRAPH_NAME -o *.graphql
Poznámky:
- Nastavte nebo nahraďte $GITHUB_USER, $SUBGRAPH_NAME příslušnými hodnotami. Jako např:
artblocks/art-blocks
- Poskytnutá adresa URL náhledového schématu (https://api-next.thegraph.com/) je silně omezená a po přechodu všech uživatelů na novou verzi bude ukončena. Nepoužívejte jej v produkčním provozu
- Operace jsou identifikovány v souborech s následujícími příponami
.graphql
,.ts
,.tsx
,.js
,jsx
(-o
option).
Výstup CLI
Nástroj [@graphql-validate/cli](https://github.com/saihaj/graphql-validate)
CLI vypíše všechny chyby operací GraphQL takto:

U každé chyby naleznete popis, cestu a pozici souboru a odkaz na příklad řešení (viz následující část).
Spouštění místních dotazů proti schéma náhledu
Poskytujeme koncový bod https://api-next.thegraph.com/
, který spouští verzi graph-node
se zapnutými validacemi.
Dotazy si můžete vyzkoušet zasláním na:
https://api-next.thegraph.com/subgraphs/id/<Qm...>
nebo
https://api-next.thegraph.com/subgraphs/name/<GITHUB_USER>/<SUBGRAPH_NAME>
Chcete-li pracovat s dotazy, které byly označeny jako dotazy s chybami validace, můžete použít svůj oblíbený nástroj pro dotazy GraphQL, například Altair nebo GraphiQL, a vyzkoušet svůj dotaz. Tyto nástroje také tyto chyby označí ve svém uživatelském rozhraní, a to ještě předtím, než jej spustíte.
Jak řešit problémy
Níže naleznete všechny chyby validace GraphQL, které se mohou vyskytnout u vašich stávajících operací GraphQL.
Proměnné, operace, fragmenty nebo argumenty jazyka GraphQL musí být jedinečné
Použili jsme pravidla pro zajištění toho, aby operace obsahovala jedinečnou sadu proměnných GraphQL, operací, fragmentů a argumentů.
Operace GraphQL je platná pouze tehdy, pokud neobsahuje žádnou nejednoznačnost.
Abychom toho dosáhli, musíme zajistit, aby některé součásti operace GraphQL byly jedinečné.
Zde je příklad několika neplatných operací, které porušují tato pravidla:
Duplicitní název dotazu (#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}
Řešení:
1query myData {2 id3}45query myData2 {6 # rename the second query7 name8}
Duplicitní název fragmentu (#UniqueFragmentNamesRule)
1# The following operation violated the UniqueFragmentName2# rule.3query myData {4 id5 ...MyFields6}78fragment MyFields {9 metadata10}1112fragment MyFields {13 name14}
Řešení:
1query myData {2 id3 ...MyFieldsName4 ...MyFieldsMetadata5}67fragment MyFieldsMetadata { # assign a unique name to fragment8 metadata9}1011fragment MyFieldsName { # assign a unique name to fragment12 name13}
Duplicitní název proměnné (#UniqueVariableNamesRule)
1# The following operation violates the UniqueVariables2query myData($id: String, $id: Int) {3 id4 ...MyFields5}
Řešení:
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}
Řešení:
1query myData($id: ID!) {2 userById(id: $id) {3 id4 }5}
Duplicitní anonymní dotaz (#LoneAnonymousOperationRule)
Použitím dvou anonymních operací se také poruší pravidlo LoneAnonymousOperation
kvůli konfliktu ve struktuře odpovědi:
1# This will fail if executed together in2# a single operation with the following two queries:3query {4 someField5}67query {8 otherField9}
Řešení:
1query {2 someField3 otherField4}
Nebo tyto dva dotazy pojmenujte:
1query FirstQuery {2 someField3}45query SecondQuery {6 otherField7}
Překrývající pole
Výběrová sada GraphQL je považována za platnou, pouze pokud správně řeší případnou sadu výsledků.
Pokud konkrétní výběrová sada nebo pole způsobí nejednoznačnost buď vybraného pole, nebo použitých argumentů, služba GraphQL operaci neověří.
Zde je několik příkladů neplatných operací, které toto pravidlo porušují:
Překrývající se aliasy polí (#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}
Řešení:
1query {2 dogs {3 name: nickname4 originalName: name # alias the original `name` field5 }6}
Konfliktní pole s argumenty (#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}
Řešení:
1query {2 dogs {3 knowsHowToSit: doesKnowCommand(dogCommand: SIT)4 knowsHowToHeel: doesKnowCommand(dogCommand: HEEL)5 }6}
Ve složitějších případech použití můžete toto pravidlo porušit také použitím dvou fragmentů, které by mohly způsobit konflikt v očekávané sadě:
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}
Kromě toho mohou vést k nejasnostem například direktivy GraphQL na straně klienta jako @skip
a @include
:
1fragment mergeSameFieldsWithSameDirectives on Dog {2 name @include(if: true)3 name @include(if: false)4}
Více informací o algoritmu najdete zde.
Nepoužívané proměnné nebo fragmenty
Operace GraphQL je také považována za platnou, pouze pokud jsou použity všechny součásti definované operací (proměnné, fragmenty).
Zde je několik příkladů operací GraphQL, které tato pravidla porušují:
Nepoužitá proměnná (#NoUnusedVariablesRule)
1# Invalid, because $someVar is never used.2query something($someVar: String) {3 someData4}
Řešení:
1query something {2 someData3}
Nepoužitý fragment(#NoUnusedFragmentsRule)
1# Invalid, because fragment AllFields is never used.2query something {3 someData4}56fragment AllFields { # unused :(7 name8 age9}
Řešení:
1# Invalid, because fragment AllFields is never used.2query something {3 someData4}56# remove the `AllFields` fragment
Neplatná nebo chybějící výběrová sada (#ScalarLeafsRule)
Výběr pole GraphQL je také platný pouze v případě, že je potvrzeno následující:
- Pole objektu musí mít zadanou výběrovou sadu.
- Okrajové pole (skalár, enum) nesmí mít zadanou výběrovou sadu.
Zde je několik příkladů porušení těchto pravidel s následujícím schématem:
1type Image {2 url: String!3}45type User {6 id: ID!7 avatar: Image!8}910type Query {11 user: User!12}
Neplatná výběrová sada
1query {2 user {3 id { # Invalid, because "id" is of type ID and does not have sub-fields45 }6 }7}
Řešení:
1query {2 user {3 id4 }5}
Chybějící výběrová sada
1query {2 user {3 id4 image # `image` requires a Selection-Set for sub-fields!5 }6}
Řešení:
1query {2 user {3 id4 image {5 src6 }7 }8}
Nesprávné hodnoty argumentů (#VariablesInAllowedPositionRule)
Operace GraphQL, které předávají pevně zadané hodnoty argumentů, musí být platné na základě hodnoty definované ve schéma.
Zde je několik příkladů neplatných operací, které porušují tato pravidla:
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}
Neznámý typ, proměnná, fragment nebo směrnice (#UnknownX)
Pokud je použit neznámý typ, proměnná, fragment nebo direktiva, rozhraní GraphQL API vyhodí chybu.
Tyto neznámé odkazy je třeba opravit:
- přejmenovat, pokud se jedná o překlep
- v opačném případě odstraňte
Fragment: neplatné rozšíření nebo definice
Neplatné rozložení fragmentů (#PossibleFragmentSpreadsRule)
Fragment nelze rozložit na nepoužitelný typ.
Příklad: fragment Kočka
nemůžeme použít na typ Pes
:
1query {2 dog {3 ...CatSimple4 }5}67fragment CatSimple on Cat {8 # ...9}
Neplatná definice fragmentu (#FragmentsOnCompositeTypesRule)
Všechny fragmenty musí být definovány na (pomocí on ...
) složeném typu, zkráceně: objektu, rozhraní nebo svazu.
Následující příklady jsou neplatné, protože definování fragmentů na skalárech je neplatné.
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}
Použití směrnic
Direktiv nelze na tomto místě použít (#KnownDirectivesRule)
Lze použít pouze direktivy GraphQL (@...
) podporované Graf API.
Zde je příklad s direktivami podporovanými GraphQL:
1query {2 dog {3 name @include(true)4 age @skip(true)5 }6}
Poznámka: @stream
, @live
, @defer
nejsou podporovány.
Direktiv lze v tomto umístění použít pouze jednou (#UniqueDirectivesPerLocationRule)
Směrnice podporované nástrojem Grafu lze v jednom umístění použít pouze jednou.
Následující text je neplatný (a nadbytečný):
1query {2 dog {3 name @include(true) @include(true)4 }5}