7 dakika
GraphQL Validations Migration Guide
Yakında “graph-node”, GraphQL Validasyon Özelliklerinin’in %100’ünü destekleyecektir.
“graph-node”un önceki sürümleri tüm doğrulamaları desteklemiyordu ve daha zarif yanıtlar veriyordu - bu nedenle, belirsizlik durumlarında “graph-node” geçersiz GraphQL işlem bileşenlerini görmezden geliyordu.
GraphQL validasyon desteği, yaklaşan yeni özelliklerin ve Graph Ağı ölçeğindeki performansın temel direğidir.
Ayrıca, Graph ağında önemli bir gereklilik olan sorgu yanıtlarının belirleyiciliğini de sağlayacaktır.
GraphQL validasyonlarını etkinleştirmek, Graph API’ye gönderilen bazı mevcut sorguları bozacaktır.
Bu doğrulamalarla uyumlu olmak için lütfen taşıma kılavuzunu takip edin.
⚠️ Doğrulamalar kullanıma sunulmadan önce sorgularınızı taşımazsanız, bunlar hata döndürecek ve muhtemelen ön uçlarınızı/istemcilerinizi bozacaktır.
Taşıma Kılavuzu
GraphQL işlemlerinizdeki sorunları bulmak ve düzeltmek için CLI taşıma aracını kullanabilirsiniz. Alternatif olarak, https://api-next.thegraph.com/subgraphs/name/$GITHUB_USER/$SUBGRAPH_NAME
uç noktasını kullanmak için GraphQL istemcinizin uç noktasını güncelleyebilirsiniz. Sorgularınızı bu uç noktaya göre test etmek, sorgularınızdaki sorunları bulmanıza yardımcı olacaktır.
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.
Geçiş CLI Aracı
GraphQL işlem hatalarının çoğu kod tabanınızda önceden bulunabilir.
Bu nedenle, geliştirme sırasında veya CI’de GraphQL işlemlerinizi doğrulamak için sorunsuz bir deneyim sağlıyoruz.
@graphql-validate/cli
, GraphQL işlemlerini belirli bir şemaya göre doğrulamaya yardımcı olan basit bir CLI aracıdır.
Başlarken
Aracı aşağıdaki gibi çalıştırabilirsiniz:
1npx @graphql-validate/cli -s https://api-next.thegraph.com/subgraphs/name/$GITHUB_USER/$SUBGRAPH_NAME -o *.graphql
Notlar:
- $GITHUB_USER, $SUBGRAPH_NAME değerini uygun değerlerle ayarlayın veya değiştirin.
artblocks/art-blocks
gibi. - Sağlanan önizleme şeması URL’si (https://api-next.thegraph.com/) büyük oranda hız sınırlamasına sahiptir ve tüm kullanıcılar yeni sürüme geçtikten sonra kullanımdan kaldırılacaktır. Çıktıda kullanmayın.
- İşlemler, aşağıdaki
.graphql
,.ts
,.tsx
,.js
,jsx
(-o
option) uzantılarına sahip dosyalarda tanımlanır.
CLI Çıktısı
[@graphql-validate/cli](https://github.com/saihaj/graphql-validate)
CLI aracı, tüm GraphQL işlemleri hatalarını aşağıdaki gibi verir:

Her hata için bir açıklama, dosya yolu ve konumu ve bir çözüm örneğine bağlantı bulacaksınız (aşağıdaki bölüme göz atın).
Yerel sorgularınızı önizleme şemasına göre çalıştırın
Doğrulamaların açık olduğu bir “Graph Node” sürümünü çalıştıran bir uç nokta https://api-next.thegraph.com/
sağlıyoruz.
Sorguları şu adrese göndererek deneyebilirsiniz:
https://api-next.thegraph.com/subgraphs/id/<Qm...>
yada
https://api-next.thegraph.com/subgraphs/name/<GITHUB_USER>/<SUBGRAPH_NAME>
Doğrulama hataları içerdiği işaretlenen sorgular üzerinde çalışmak için Altair veya GraphiQL gibi en sevdiğiniz GraphQL sorgulama aracını kullanabilir ve sorgunuzu deneyebilirsiniz. Bu araçlar, siz çalıştırmadan önce bile kullanıcı arayüzlerinde bu hataları işaretleyecektir.
Sorunları nasıl çözeceğiz?
Aşağıda, mevcut GraphQL işlemlerinizde meydana gelebilecek tüm GraphQL doğrulama hatalarını bulacaksınız.
GraphQL değişkenleri, işlemleri, parçaları veya bağımsız değişkenleri benzersiz olmalıdır
Bir işlemin benzersiz bir GraphQL değişkenleri, işlemler, parçalar ve bağımsız değişkenler kümesi içermesini sağlamak için kurallar uyguladık.
Bir GraphQL işlemi, yalnızca herhangi bir belirsizlik içermiyorsa geçerlidir.
Bunu başarmak için, GraphQL işleminizdeki bazı bileşenlerin benzersiz olmasını sağlamamız gerekiyor.
Aşağıda, bu kuralları ihlal eden birkaç geçersiz işleme örnek verilmiştir:
Yinelenen Sorgu Adı (#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)
Ayrıca, iki anonim işlemin kullanılması, yanıt yapısındaki çakışma nedeniyle LoneAnonymousOperation
kuralını ihlal edecektir:
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}
Veya iki sorguyu adlandırın:
1query FirstQuery {2 someField3}45query SecondQuery {6 otherField7}
Çakışan Alanlar
Bir GraphQL seçim seti, yalnızca nihai sonuç setini doğru bir şekilde çözerse geçerli kabul edilir.
Belirli bir seçim kümesi veya bir alan, seçilen alan veya kullanılan bağımsız değişkenler nedeniyle belirsizlik yaratırsa, GraphQL hizmeti işlemi doğrulamada başarısız olur.
Bu kuralı ihlal eden geçersiz işlemlere birkaç örnek:
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}
Ayrıca, daha karmaşık kullanım durumlarında, sonunda beklenen kümede bir çakışmaya neden olabilecek iki parça kullanarak bu kuralı ihlal edebilirsiniz:
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}
Buna ek olarak, “@skip” ve “@include” gibi müşteri tarafı GraphQL yönergeleri belirsizliğe yol açabilir, örneğin:
1fragment mergeSameFieldsWithSameDirectives on Dog {2 name @include(if: true)3 name @include(if: false)4}
Algoritma hakkında daha fazla bilgiyi buradan edinebilirsiniz.
Kullanılmayan Değişkenler veya Parçalar
Bir GraphQL işlemi, yalnızca tüm işlem tanımlı bileşenler (değişkenler, parçalar) kullanılıyorsa geçerli kabul edilir.
İşte bu kuralları ihlal eden GraphQL işlemleri için birkaç örnek:
Kullanılmayan Değişken (#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:
1# Invalid, because fragment AllFields is never used.2query something {3 someData4}56# remove the `AllFields` fragment
Geçersiz veya Eksik Seçim Kümesi (#ScalarLeafsRule)
Ayrıca, bir GraphQL alan seçimi yalnızca aşağıdakiler doğrulanırsa geçerlidir:
- Bir nesne alanında olması gereken seçim kümesi belirtildi.
- Bir kenar alanı (scalar, enum) belirtilen bir seçim kümesine sahip olmamalıdır.
Aşağıda, aşağıdaki şema ile bu kuralların ihlaline ilişkin birkaç örnek verilmiştir:
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}
Yanlış Bağımsız Değişken Değerleri (#VariablesInAllowedPositionRule)
Sabit kodlu değerleri bağımsız değişkenlere ileten GraphQL işlemleri, şemada tanımlanan değere göre geçerli olmalıdır.
Aşağıda, bu kuralları ihlal eden geçersiz işlemlere ilişkin birkaç örnek verilmiştir:
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# Bu, yanlış bir değişken tanımlandığında da olabilir: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}
Bilinmeyen Tür, Değişken, Parça veya Yönerge (#UnknownX)
Herhangi bir bilinmeyen tür, değişken, parça veya yönerge kullanılırsa GraphQL API bir hata verir.
Bu bilinmeyen referanslar düzeltilmelidir:
- bir yazım hatasıysa yeniden adlandır
- aksi halde kaldır
Parça: Geçersiz Yayılma Veya Tanım
Geçersiz Parça Yayılması (#PossibleFragmentSpreadsRule)
Bir parça, geçerli olmayan bir türe yayılamaz.
Örnek olarak, “Dog” türüne bir “Cat” parçası uygulayamayız:
1query {2 dog {3 ...CatSimple4 }5}67fragment CatSimple on Cat {8 # ...9}
Geçersiz Fragment Tanımı (#FragmentsOnCompositeTypesRule)
Tüm parçalar (‘on …’ kullanılarak) bir bileşik tipte tanımlanmalıdır, kısacası: nesne, arayüz veya birleşim.
Aşağıdaki örnekler geçersizdir, çünkü skalerler üzerinde parça tanımlama geçersizdir.
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}
Direktif kullanımı
Yönerge bu konumda kullanılamaz (#KnownDirectivesRule)
Yalnızca Graph API tarafından desteklenen GraphQL yönergeleri (”@…”) kullanılabilir.
İşte GraphQL tarafından desteklenen direktiflere bir örnek:
1query {2 dog {3 name @include(true)4 age @skip(true)5 }6}
Not: @stream
, @live
, @defer
desteklenmez.
Yönerge bu konumda yalnızca bir kez kullanılabilir (#UniqueDirectivesPerLocationRule)
Graph tarafından desteklenen direktifler, lokasyon başına sadece bir kez kullanılabilir.
Aşağıdakiler geçersiz (ve gereksiz):
1query {2 dog {3 name @include(true) @include(true)4 }5}