Architektur
ArchitekturEntkopplung von angeforderten und ausführbaren queries

Entkopplung von angeforderten und ausführbaren queries

Gato GraphQL verwendet eine Directive-Pipeline, eine Architektur, die es der Server-Engine ermöglicht, die Query aufzulösen, zu validieren und auszuführen. Um die Engine so einfach wie möglich zu halten, findet jede Aktion im Zusammenhang mit der Auflösung der Query innerhalb der Pipeline statt – durch Direktiven.

Die Directive-Pipeline

Der Resolver wird aufgerufen, um ein Feld zu validieren und aufzulösen und dessen Ausgabe in die Antwort zu mergen – das geschieht über zwei spezielle Direktiven: @validate und @resolveValueAndMerge. Diese Direktiven sind von einem besonderen Typ: Sie werden nicht von der Anwendung hinzugefügt (weder in der Query noch im Schema), sondern von der Engine selbst. Diese 2 Direktiven sind implizit und werden immer zu jedem Feld jeder Query hinzugefügt.

Aus dieser Strategie lässt sich erkennen, dass beim Ausführen einer Query auf dem GraphQL-Server tatsächlich 2 queries beteiligt sind:

  • Die angeforderte Query
  • Die ausführbare Query

Die ausführbare Query, die letztendlich vom Server aufgelöst wird, entsteht durch Transformationen der angeforderten Query – unter anderem durch das Einfügen der Direktiven @validate und @resolveValueAndMerge für jedes Feld.

Interner Prozess im GraphQL-Server

Wenn die angeforderte Query beispielsweise diese ist:

{
  posts {
    url
    title @uppercase
    content @include(if: $addContent)
  }
}

Dann wird die ausführbare Query diese sein:

{
  posts @validate @resolveValueAndMerge {
    url @validate @resolveValueAndMerge
    title @validate @resolveValueAndMerge @uppercase
    content @validate @include(if: $addContent) @resolveValueAndMerge
  }
}

Wo wird es verwendet

Gato GraphQL nutzt diesen Mechanismus zur Erzeugung der ausführbaren Query in folgenden Situationen: