Transkripte
1. Einführung und was dieser Kurs überdeckt: Willkommen zu diesem Kurs. Ich freue mich, Ihnen eine der gefragtesten
Webentwicklungstechnologien im Moment beizubringen , nämlich GraphQL. GraphQL ist eine moderne Art, APIs zu erstellen, um das Back-End unserer Projekte zu erstellen. Es bietet im Grunde eine einfache
Syntax zu verwenden , um die genauen Daten, die wir wollen, an unser Front-End zu bekommen. Wir haben sagen, eine Website oder ein mobiles Gerät oder einen anderen Dienst. Dieser Einführungskurs behandelt alle Grundlagen für den Einstieg, wie die Einrichtung unserer GraphQL-Server, die Arbeit mit Abfragen, Mutationen und Abonnements, die Funktionsweise der Typen und die Beziehungen zwischen ihnen. Schriftliche Resolver, und wie man eine echte Datenbank einrichtet und auch interaktiv PRISMA verwendet, zusammen mit vielen mehr, die Sie finden, wenn wir durch den Kurs gehen. Am Ende dieses Kurses werden
Sie wissen, was all dies ist und wie wir sie auf alle Projekte anwenden können. Wir werden nicht nur langweilige Theorie in diesem Kurs behandeln. In der Tat, so ziemlich alle Beispiele, die wir behandeln, werden
wir es zu einem Kursprojekt machen. Hierbei handelt es sich um ein Filmrezensionsprojekt, bei dem Benutzer
basierend auf den Filmen in der Datenbank eine Rezension erstellen können . Sie werden lernen, wie Sie mit dem Server und auch der Datenbank interagieren, Daten wie neue Benutzer,
Filme und Rezensionen
posten , zusammen mit, wie Sie die genauen Daten, die wir wollen, wie die Auflistung von Bewertungen für bestimmte Benutzer. Wie wir relationale Daten
wie Rezensionen mit Filmen verknüpfen können , und auch mit dem Benutzer, der sie erstellt hat. Dieser Kurs richtet sich an Anfänger in GraphQL und auch PRISMA und auch an Neulinge, die auf der Serverseite arbeiten. Ich würde jedoch
zumindest einige grundlegende Erfahrung von JavaScript oder einer ähnlichen Sprache empfehlen . Dies wird Ihnen wirklich helfen, diesen Kurs zu durchlaufen. Auch ein grundlegendes Verständnis der Rolle eines Servers und
einer Datenbank wird Ihnen helfen, das Beste zu nutzen, wenn Sie den Kurs durchlaufen.
Daher hoffen wir, dass Sie bereit sind, Ihre Fähigkeiten auf
die nächste Stufe zu bringen , indem Sie GraphQL und PRISMA lernen.
2. Was ist GraphQL?: Bevor wir zum Aufbau eines echten GraphQL-Servers kommen. Ich möchte mir einen Moment Zeit nehmen, um genau darüber zu gehen, was GraphQL ist und warum so populär wird. GraphQL wurde ursprünglich bei Facebook erstellt und ist jetzt ein Open-Source-Projekte. Ist keine Programmiersprache, ein Framework oder so etwas. Es ist ein Standard für den Aufbau modernen A-P-Is oder generell das Senden von Daten von einem Server an den Client. In der Webentwicklungswelt kann
es ermöglichen, dass Daten zwischen einem Client und einem Server gesendet werden. Ein Client, der sich auf der linken Seite dieser Folie befindet. Was alles von einem Browser,
Smartphone eines Computers oder irgendetwas anderes sein kann , das Daten abrufen muss. Diese Kommunikation erfolgt über H-T-P Requests und der Server auf der rechten Seite. Das sendet die angeforderten Daten zurück an diese Clients. Dies besteht in der Regel aus einem Webserver, um Anfragen von den Clients zu bearbeiten, und auch aus einer Datenbank,
von der Server bei Bedarf Daten abrufen kann , bevor diese an den Client zurückgesendet werden. Eine beliebte Möglichkeit, dem Client und Server die
Kommunikation zu ermöglichen , ist die Verwendung eines sogenannten REST A-P-I. Ein A-P-I ist eine Reihe von Regeln, um die Kommunikation zwischen verschiedenen Teilen der Software zu ermöglichen. In unserem Fall, der Client und Server. Größere Kleinunternehmen stellen Daten oftmals über ein A-P-I öffentlich zur Verfügung. Zum Beispiel; Spotify hat ein A-P-I, so dass wir auf sie Musikkatalog zugreifen können. Das bedeutet, dass jeder
seinen eigenen persönlichen Musik-Player bauen und dann Spotify-Daten verwenden kann, um Songs,
Wiedergabeliste, Künstlerinformationen und vieles mehr zu erhalten . Google hat auch viele A-P-I zu. So können Anwendungen beispielsweise auf Google Maps-Daten zugreifen, oder Sie können Ihre eigenen Videoplayer-Websites
erstellen und dann YouTube-Videos hinter den Kulissen verwenden. Traditionelles A-P-wird oft als REST A-P-Is bezeichnet. Allerdings haben einige Einschränkungen mit diesen A-P-Is. Sie verfügen in der Regel über mehrere Endpunkte, um Daten abzurufen. Zum Beispiel: Dies sind Spotify Basis-Endpunkte an der Spitze, die ein U-R-L ist. Darunter erweitern
wir diese U-R-L, um mehr Daten wie ein Album durch das Album/ID zu erhalten. Dann unten können wir auch Schrägstriche
zu diesem U-R-L hinzufügen , um alle Tracks für dieses spezielle Album zu erhalten. Basierend auf unserem Projekt, das in diesem Kurs gebaut wird. Nehmen wir an, wir wollten Filmrezensionen für einen Benutzer erhalten. Mit einem REST A-P-I müssen
wir möglicherweise mehrere Anfragen an
verschiedene Endpunkte stellen , um alle Daten zu erhalten, die wir benötigen, wie den Benutzerendpunkt, den Testendpunkt und auch den Filmendpunkt. Je nachdem, wie das A-P-I strukturiert war. Dies kann dazu führen, dass wir mehr Informationen zurückbekommen, als wir brauchten. Wenn wir nur den Titel des Films brauchen. Möglicherweise müssen wir auch alle anderen Filmdaten wie ID,
Beschreibung, Kundeninformationen usw. zurückerhalten . Zusammen mit mehreren Anfragen, die zeitaufwändig sein können. Obwohl mit diesem Ansatz nichts grundlegend falsch ist, bietet
GraphQL uns eine bessere Alternative. GraphQL hat nur einen Endpunkt, mindestens eine Abfrage für unsere Daten betroffen und es hat die Flexibilität, uns nur die genauen Daten zurückzugeben, die wir benötigen. Zum Beispiel: Ein mobiles Gerät muss aufgrund
der reduzierten Bildschirmgröße möglicherweise nicht die gleichen Daten wie eine Desktop-Website zurückerhalten . Ein kleines Gerät kann nur die Rezensionen
grundlegende Informationen wie den Autorennamen und Filmtitel wollen . Während die Desktop-App möglicherweise auch weitere Informationen wünschen, z. B. die Filmbewertung und die Beschreibung. Dies kann leicht mit GraphQL erreicht werden, während REST A-P-Is aufgrund der Verwendung dieser starren Endpunkte
Schwierigkeiten hat, die gleiche Flexibilität zu bieten. Ich werde viel Übung bekommen, um
die Daten zu beschreiben , die wir während dieses Kurses zurückbekommen möchten. Dies macht GraphQL zu einer wirklich flexiblen, schnellen und effizienten Möglichkeit, Daten in unsere Projekte einzubinden.
3. Was wir bauen werden: Während wir diesen Kurs durchlaufen, werden
wir ein Projekt erstellen, das auf Filmrezensionen basiert. Die ganze Idee ist, dass wir Benutzer erstellen können, wir können Filme erstellen, und dann kann jeder Benutzer eine Bewertung basierend auf dem jeweiligen Film erstellen. Da wir GraphQL verwenden, die
eine Abfragesprache zum Erstellen des Back-Ends von Websites ist , werden
wir keine Benutzeroberfläche für
dieses Projekt haben , sondern wir werden stattdessen verwenden, was Sie hier sehen können, und Dies wird der GraphQL-Spielplatz genannt , der es uns ermöglicht, mit all unseren Daten zu interagieren, unabhängig davon, ob diese in unserem Projekt gespeichert sind oder in einer Datenbank gespeichert werden, die wir hinzufügen werden. Wenn das alles ein bisschen verwirrend und ungewohnt aussieht, aber was hast du gesagt? Ja, da wir viel Übung mit einem GraphQL-Spielplatz bekommen, während wir gehen. Während wir gehen, werden wir den gesamten Code erstellen, den wir für
unseren Server benötigen und Daten in unserer Datenbank speichern. Wir werden Dinge tun, wie
Abfragen durchführen , wo wir Daten wie Filme erhalten. Hier ist eine Liste aller Filme in unserer Datenbank. Wir werden das Gleiche für die Benutzer tun. Wir werden den ganzen Code schreiben, um uns zu ermöglichen, Benutzer zu greifen, und alle zugehörigen Daten, wie der Benutzer ist mit den Bewertungen verknüpft und auch die Bewertungen, die mit einem Benutzer und auch mit einem Film verbunden sind. Dies wird uns eine Menge zu gehen Praxis Kunst, Kunst in Beziehungen zwischen unseren verschiedenen Arten. Wir können auch Dinge tun, wie Grabbing Bewertungen durch Benutzer und GraphQL ist wirklich flexibel, so dass wir nur die genauen Daten zurückziehen, die wir wollen. All diese Daten stammen aus unserer Datenbank, strukturiert wie ein Objekt. Es ist einfach, an jedes Front-End zu senden, egal ob es sich um eine Website oder ein mobiles Gerät handelt. All diese Daten werden in
einer realen Datenbank gespeichert , wo wir die prismatische Interaktion mit unserer Datenbank setzen. Dies gibt uns eine viel bessere visuelle Darstellung. Wir können unsere Nutzer,
unsere Filme und alle Bewertungen sehen , die hinzugefügt werden. Wir können auch alle Beziehungen sehen. Wenn wir uns den Film anschauen, können wir die Kritiken sehen und wie viele für jeden. Dasselbe für die Benutzer. Wir können sehen, wie viele Bewertungen für jeden gepostet wurden, die connies, und dann können wir auch zu dieser Bewertung gebracht werden. Zurück auf dem Spielplatz, sowie das Lesen von Daten aus der Datenbank, wird auch sehen, wie wir Benutzer anmelden können, wird auch schauen, wie wir CreateMovies, und auch schauen, wie wir Bewertungen erstellen können, die verknüpft sind an den Film und den Benutzer. Eine weitere großartige Funktion bei der Verwendung GraphQL ist, dass wir auch das, was ein Abonnement genannt wird, verwenden können. Und dies ermöglicht es uns, Daten zu abonnieren. Jedes Mal, wenn sich die Daten auf dem Server ändern, wird
sie automatisch an unser Front-End weitergeleitet, sodass wir über Änderungen informiert werden. Dies ist ideal für etwas wie eine Rezension. Jedes Mal, wenn eine neue Rezension erstellt wird, lassen Sie uns einfach hier eine Rezension erstellen. Wir sehen dann, dass diese Daten an unser Front-End geschoben werden. Wir können die Dinge auf dem Laufenden halten, wenn sie sich ändern. Nochmals, mach dir keine Sorgen über das, was du hier siehst. Dies wird uns nur erlauben, mit
den Daten zu interagieren , die wir während dieses Kurses erstellen werden. Wir werden keine Zeit verschwenden, um mit unserem neuen Projekt in den Griff zu bekommen. Ich werde das im nächsten Video starten.
4. Unser Projekt und GraphQL-Yoga einrichten: Während dieses Kurses werden wir einen Film Review Basis GraphQL Server erstellen
, den wir bereits angesehen haben. Um zu beginnen, müssen wir einen Ordner für
Projekte erstellen und ich möchte meinen auf dem Desktop für einfachen Zugriff platzieren. Ich werde diesen Film Bindestrich Review nennen. Öffnen Sie es dann in Visual Studio Code, den ich als Texteditor für den Kurs verwende. Lassen Sie uns dies öffnen und ziehen Sie dann über den Projektordner in VS-Code. Sie können natürlich jeden Texteditor verwenden, den Sie bevorzugen. Bevor wir etwas anderes tun, müssen
Sie sicherstellen, dass Node auf Ihrem Computer installiert ist. Um dies zu tun, öffnen Sie den Browser und dann müssen wir zu Nodejs.org gehen. Klicken Sie auf den Download für die neueste Version. Sobald dies installiert ist, laufen wir dann durch die Installation wie bei einem
beliebigen Download. Ich werde darauf klicken. Fahren Sie weiter durch. Muss der Lizenzierung zustimmen, und installieren Sie diese dann auf meiner Festplatte. Es sollte nur ein paar Augenblicke dauern, um zu installieren. Sobald dies erledigt ist, löschen Sie dies den und Weg, dann können wir zurück zu Visual Studio Code gehen. Ich werde ein Terminal öffnen, ich gehe zum Terminal und dann neues Terminal. Unten unten sehen Sie, dass das Terminal jetzt geöffnet ist und wir können einige Befehle ausführen. Der erste, den Sie tun möchten, ist,
den Knoten zu überprüfen und NPM wurde erfolgreich installiert. Wir tun dies, indem wir Node-V überprüfen und dies wird uns die Knotenversion des Bucks geben, die installiert haben. Wenn Sie einen Fehler anstelle einer Versionsnummer sehen, ist ein Problem bei der Installation des Knotens aufgetreten, und Sie müssen zuerst zurückgehen und dies tun. Wir könnten auch mit Node Package Manager mit NPM B überprüfen. Sie sollten uns auch die Version von NPM
installiert haben und es kommt mit dem Knotendownload gebündelt. Großartig. Innerhalb des Terminals können wir NPM darin ausführen. Drücken Sie die Eingabetaste und dies wird unsere Projekte initialisieren. Ich werde nur volle Optionen eingeben, wobei die meisten der Veranstaltungsorte als Standardwerte beibehalten werden. Der Paketname, Ich gebe ein, die Versionsbeschreibung. Der, der sich auf make ändert, ist, anstatt die Einstiegspunkte als index.js zu haben, ich möchte Änderungen an der Quelle, also src/idex.js, geben Sie ein und geben Sie dann alle restlichen Optionen ein. Wenn wir die Seitenleiste öffnen, können
wir innerhalb unseres Ordners sehen wir jetzt eine package.json Datei. Diese enthält alle Informationen über unser Projekt, die eingegeben werden. Dies ist eine ziemlich Standard-Node-Datei und nichts spezifisches für GraphQL an dieser Stelle. Als nächstes erstellen wir unsere Datei index.js, die als Einstiegspunkte hinzugefügt wird. Gehen Sie zurück zur Seitenleiste in unserem geöffneten Editor und erstellen Sie einen neuen Ordner im Stammverzeichnis unseres Projekts, der
die Quelle ist, also src. Im Inneren können wir unsere Index-Seite erstellen, die index.js ist. Da GraphQL eher eine Spezifikation als eine tatsächliche Programmiersprache, eine Bibliothek oder irgendetwas anderes ist, müssen
wir darauf warten, GraphQL tatsächlich in realen Projekten zu verwenden. GraphQL als Spezifikation ist nicht spezifisch für jede Programmiersprache. Daher müssen wir ein Paket oder eine Implementierung für Knoten verwenden, die für diesen Kurs verwendet wird. Der, den ich benutze, heißt GraphQL Yoga. Es gibt natürlich andere Alternativen, aber das ist eine, die ich für diesen Kurs verwenden werde, da er viele Funktionen hat und es einfach ist, mit zu arbeiten. Gehen Sie zum Browser und öffnen Sie Chrome. Dann werde ich in einem neuen Tab nach GraphQL Yoga suchen. Wir können sehen, es ist ein GitHub Link hier für GraphQL Yoga, die uns zur Dokumentation führt. Andere Implementierungen sind auch verfügbar für, so dass wir GraphQL verwenden können, in anderen Sprachen oder Umgebungen wie Python. GraphQL Yoga ist ein einfach zu bedienender und einzurichtende GraphQL-Server
, der es uns ermöglicht, alle GraphQL-Funktionen zu nutzen , die benötigt werden, wie Abfragen, Mutationen und Abonnements, um nur einige zu nennen. Oben in unserem Projekt bis zum Terminal können wir NPM verwenden, um dieses Paket zu installieren. NPM, die für die Installation von graphql-yoga ist. Sobald dies installiert ist, können wir unsere index.js Datei verwenden. Wir haben bereits damit begonnen, zu kreieren. Machen Sie unseren GraphQL-Server. Wir werden in dieser Datei index.js beginnen, indem Sie den GraphQL-Server benötigen. Also const GraphQL Server, Ich bin vorsichtig mit dem Gehäuse hier, das ist gleich zu verlangen, Ich werde unser GraphQL Yoga-Paket benötigen, graphql-yoga. Als nächstes müssen wir eine neue Instanz dieses GraphQL-Servers erstellen. Ich werde dies einen konstanten Namen des Servers nennen und dies auf eine neue Instanz von GraphQL Server
setzen. Dieser GraphQL-Server nimmt ein Objekt auf und würde dann hier zwei Eigenschaften übergeben. Diese Eigenschaften werden TypeDefs und Resolver genannt. Die erste TypeDefs, und dann Resolver. Wir können dann diesen Server, den wir erstellt haben und dann die Startmethode aufrufen. Die Startmethode nimmt dann einen Callback auf, der eine Funktion ist, die dies vor dem Start der Umfrage ausführt. Einfaches Konsolenprotokoll wird vorerst in Ordnung sein. Lassen Sie uns dies in eine Funktion verwandeln, die ein Konsolenprotokoll zurückgibt. Dieses Konsolenprotokoll wird nur senden eine Nachricht von Server läuft auf localhost, Pause 4000, und da gehen wir. Dies ist unser grundlegendes Diagramm SQL Server jetzt an Ort und Stelle. Als nächstes werden wir einige Beispieldaten einschließen, mit denen Sie arbeiten können, bevor Sie zurückkehren, werfen Sie einen genaueren Blick auf die TypeDefs und Resolver, die Sie in unseren Server übergeben.
5. Beispieldaten für Arbeit: In diesem Kurs ist ein Download enthalten, der einige Beispieldaten enthält, diesen Download sitzt hier als Textdatei auf dem Desktop. Wenn wir zum ersten Mal mit der Grafik QL beginnen, benötigen
wir möglicherweise einige temporäre Daten, um mit zu beginnen. Bis wir unser Datenbank-Setup später mit PRISMA erhalten. Also gehen Sie weiter und laden Sie die Beispieldatendatei herunter, oder wenn Sie es bevorzugen, können Sie sie stattdessen eingeben. Wir müssen neue Datei auf unserem Projekt erstellen, um diese Beispieldaten zu kopieren. Also werde ich die Seitenleiste öffnen, und innerhalb des Quellordners werde
ich eine neue Datei namens sampledata.js erstellen. Öffnen Sie die Beispieldatentextdatei, wählen Sie alle aus, kopieren Sie oder weniger, und fügen Sie diese dann in unsere Beispieldaten ein. Dies ist nur einige Informationen, um mit Graph QL zu beginnen, wir haben eine Reihe von Benutzern, wir haben eine Reihe von Filmen, und wir haben auch eine Reihe von Bewertungen, Modul exportiert alle diese können wir sie in unserem Projekt verwenden. Wir können dann die Beispieldaten in unserer index.js Datei benötigen, robin verwendet Filme und Bewertungen Array, ich möchte dies an der Spitze tun und diese als Konstante setzen. Wir können alle Filme derselben Linie importieren. Also verwendet, Filme und Rezensionen, und dann können wir unsere Beispieldatendatei hier benötigen, da dies kein Knotenmodul ist, müssten Sie den vollständigen Dateipfad hinzufügen? In unserem Fall befindet es sich an der gleichen Position, also Punktschrägstrich und dann Beispieldaten. Keine Notwendigkeit für die js-Erweiterung. Jetzt brauchen wir eine Möglichkeit, diese benutzerdefinierten Daten für den Rest unseres Servers zur Verfügung zu stellen, und Graph QL Yoga bietet das Kontextobjekt, damit wir dies tun können. In der Seite unseres Servers. Ich werde diese zwei neuen Zeilen hinzufügen, die besser lesbar sind, wir haben die TypeDefs, die Resolver, und dann werde ich als nächstes ein Komma
hinzufügen und auch im Kontext übergeben. Wir richten dies als Objekt ein, so dass wir mehrere Elemente übergeben können. Wir werden in den Filmen des Benutzers und auch Bewertungen hinzufügen, und diese drei sind die gleichen Namen, die Sie es oben hier als unsere Konstanten übergeben. Also das Matchup innerhalb des Kontexts, wenn dies im Moment keinen Sinn ergibt, keine
Sorge, das wird klarer, was das in kommenden Videos tut. Betrachten Sie dies zunächst als ein Stück Setup-Arbeit, und wir werden mit diesen Daten im nächsten Video beginnen.
6. Erstes Anschauen: Bisher haben wir unseren GraphQL-Server erstellt, der die TypeDefs und auch die Resolver
übergeben hat. Wir haben uns noch nicht angesehen, was diese sind, aber beide sind sehr wichtige Teile im GraphQL-Puzzle. Das ist, was wir in diesem Video betrachten werden. Beginnend mit dem TypeDefs
, der für Typdefinitionen kurz ist. Dies ist unser GraphQL-Schema, das es uns im Grunde erlaubt, unsere Daten mit Typen wie einer Textzeichenfolge
oder einem booleschen Wert von true und false zu strukturieren . Da GraphQL in jeder Programmiersprache verwendet werden kann, schreiben
wir GraphQL-Dienste mit einer speziellen Syntax namens GraphQL-Schemasprache, die ziemlich einfach zu erreichen ist. Wir werden viel Übung in diesem Kurs haben. Wir haben dann die Resolver, wo wir unsere Funktionen fragen, die tatsächlich die Operation ausführen, die wir wollen, basierend auf unserem Schema. Jedes Feld in unserem Schema wird durch eine Funktion mit dem gleichen Namen in den Resolvern gespiegelt. Sehen wir uns einige Beispiele dafür an, wie dies in Aktion funktioniert. Eine jetzt gleiche index.qs-Datei direkt über unserem Server. Ich werde damit beginnen, unsere TypeDefs zu erstellen. Also const TypeDefs, und dies wird gleich einer Zeichenfolge sein, die wir mit den hinteren Ticks verwenden. Also mach das auf. Fügen Sie diese einmal in eine neue Zeile direkt unter dieser Einrichtung einer Const von Resolvern hinzu. Service dies gleich einem leeren Objekt für jetzt. Beginnen wir mit dem Blick auf die TypeDefs, oder die Typdefinitionen. Bei der Verwendung von GraphQL werden wir viel über Typen sprechen. Es sind diese Typen, die unsere Daten beschreiben. Um zu beginnen, haben wir drei Stammtypen, Abfrage, Mutation und Subskription. Diese Typengruppen deckten die Operationen ab, die wir ausführen möchten. Fügen wir diese jetzt hinzu. Also der erste Typ, der Query sein wird, Großbuchstaben Q, und setzen Sie dies auf ein Objekt. Der zweite Wurzeltyp wird für Mutationen sein, also geben Sie Mutation, Kapital M ein. Der dritte wird Subskription sein, geben Sie Subskription ein. Setzen Sie dies erneut auf ein Objekt. Eine Abfrage wird verwendet, um unseren Server abzufragen und die Daten zurück zu erhalten, die wir wollen. Eine Mutation sendet neue Daten an den Server. Schließlich haben wir ein Abonnement, das uns die Echtzeit-Funktionalität bietet, so dass die Server Daten an den Client senden, sobald es sich ändert. Wir werden uns jedoch auf Anfragen für diese Zeit konzentrieren. So können wir einfach die Mutation und das Abonnement für den Moment löschen, und wir werden auf diese zurückkehren, wenn wir sie während des Kurses benötigen. Die Abfrage wird erstellt, indem Sie ihm zuerst einen Namen geben, gefolgt von einem Typ
, den wir erwarten, zurück zu erhalten. Ein einfaches Beispiel würde in etwa so aussehen. Würde eine Abfrage Namen des Films haben, und wir erwarten, eine Zeichenfolge zurück zu bekommen. Wir können Ausrufezeichen am Ende hinzufügen, die optional ist. Dies ist zu erklären, dass wir immer
einen Bildschirm zurück wollen und es kann nie der Wert von null sein. Es kann leer sein, wenn keine Daten gefunden werden, aber der zurückgegebene Wert darf keinen Nullwert enthalten. Der zweite Teil besteht darin, einen Resolver für diesen Film Query einzurichten. Denken Sie daran, dass wir gesagt haben, dass jede Abfrage einen Resolver mit einem übereinstimmenden Namen haben muss. Dieser Resolver ist verantwortlich für die Durchführung der Operation, die wir
in unserem Fall wollen, um einen Namen eines Films zu erhalten. Genau wie die TypeDefs nehmen
die Resolver ein übereinstimmendes Query, Mutation und Subskriptionsobjekt ein, um sie zusammenzufassen, aber jetzt brauchen wir nur die Abfrage. Also innerhalb des Resolvers-Objekts können
wir unsere Queries mit einem großen Q einrichten. Hier können wir alle unsere Queries auflisten und wir werden nur eine für jetzt haben. So können wir Query Resolve Methode mit einem übereinstimmenden Namen des Films lösen. Film wird eine Funktion sein, die einfach eine Zeichenfolge zurückgeben wird. Also Rückgabewert, können wir einen beliebigen Namen hinzufügen, den wir wollen. Also ist der Lego-Film in Ordnung. Dies wird eine Zeichenfolge zurückgeben, da dies das ist, was wir für unsere Abfrage gerade oben benötigen. Wenn du jetzt etwas verwirrt bist, ist
das ganz normal. Ich war es auch, als ich das zum ersten Mal lernte, da es ein bisschen anders ist als das, was wir vorher benutzt haben. Eine Menge von dem, was wir für den Rest des Kurses tun, wird genau diesem Muster folgen, so dass Sie viel Übung bekommen. Jetzt können wir den Server im Terminal starten und überprüfen, ob dies funktioniert. Unten können
Sie innerhalb des Terminals den Knoten
und dann die Quelle oder /index.js eingeben . Denken Sie daran, dies ist der Einstiegspunkt, den wir früher festgelegt haben. Drücken Sie „Enter“. Jetzt sehen wir die Nachricht des Servers läuft auf localhost 4000,
was die Nachricht ist, die wir aus unserem Konsolenprotokoll zurückbekommen. Lassen Sie uns Chrome öffnen, geben Sie localhost 4000 ein. Dies wird uns den Graph QL Spielplatz eröffnen. Denken Sie daran, GraphQL ist ein Server oder Back-End für unsere Websites und Anwendungen. Dieser GraphQL-Spielplatz ermöglicht es uns, mit unseren Service-Daten bei der Entwicklung zu interagieren. Lasst uns das auf der linken Seite rüber gehen. Da dies eine Abfrage ist, die wir eingerichtet
haben, können wir in Query gefolgt von den geschweiften Klammern eingeben. Wir haben bisher nur eine Abfrage, die Filme ist. Also können wir das jetzt einbeziehen. Sie können sehen, dass der Spielplatz hat eine wirklich gute auch abgeschlossen, und es wird versuchen, die Namen unserer Anfragen und die Felder vorzuschlagen, wie wir gehen. Nun, wenn wir voran gehen und drücken Sie die Play-Taste in der Mitte auf der rechten Seite, können
wir sehen, dass die Filmdaten zurückgegeben wurden. Wir haben den Abfragenamen des Films, den wir gesetzt haben, und auch die Textzeichenfolge, die wir im Resolver gesagt haben. Ich werde jetzt eine weitere Abfrage hinzufügen, um etwas mehr Übung zu bekommen. Diese Abfrage wird ein Benutzer sein, der einen String-Typ erneut zurückgibt, und der Resolver gibt jeden von Ihnen gewählten Benutzernamen zurück. Also beginnend mit den TypeDefs von oben, starten
Sie den Film. Wir können in unserem Benutzer Doppelpunkt hinzufügen. Dies wird wieder eine Zeichenfolge mit dem Ausrufezeichen zurückgeben,
was bedeutet, dass wir keinen Wert von null vom Server zurückgeben möchten. Danach richten wir unseren Resolver unten ein. Kurz nach dem Film können wir ein Komma hinzufügen, unsere Benutzermethode
einrichten und dann einen Zeichenfolgenwert zurückgeben. Ich war, um meinen Namen hier hinzuzufügen, gibt uns einen Safe über Chrome. Jetzt, wenn wir neu laden, und statt Film brauchen wir Benutzer. Sie können sehen, ob wir in US eingeben, dass die automatische Vervollständigung nicht funktioniert. Dies liegt daran, wenn wir im Moment Änderungen vornehmen, müssen
wir unseren Server neu starten. Also zurück in seinem Terminal, unten unten auf der Unterseite, Kontrolle und C wird den Server schließen. Dann wieder können wir Knoten, Quelle oder /index.js ausführen. Dadurch wird unser Server erneut neu gestartet. Laden Sie die Spielplätze neu. Jetzt können wir sehen, der Benutzertyp ist auch
in einem Spiel abgeschlossen und wir erhalten den zurückgegebenen Benutzernamen. Dies ist ein erster grundlegender Blick auf die Verwendung von Abfragen in GraphQL. Als nächstes werden wir uns mit einigen verschiedenen Typen über die neue Zeichenfolge beschäftigen, und auch, wie wir Argumente in unsere Abfragen übergeben können.
7. Scalar Typen und Überweisung in Argumenten: In diesem Video werden wir zwei wichtige Dinge tun. Nummer eins haben wir entdeckt, wie man Argumente in unsere Abfragen analysiert. Dies ermöglicht uns, so viel mehr zu tun, einschließlich des Zugriffs auf die Beispieldaten, die wir zuvor erstellt haben. Nummer zwei, bisher haben wir uns nur die Art der Zeichenfolge angesehen. Ich möchte Ihnen zeigen, welche anderen Typen auch verfügbar sind. Standardmäßig verfügt GraphQL über fünf skalare Typen, die zur Beschreibung unserer Daten verfügbar sind. Was sind das im Kommentar oben? Der erste, den wir bereits angeschaut haben, ist String. Wir haben auch eine ganze Zahl, einen Float, einen booleschen Wert und schließlich eine ID. Diese Typen sind ziemlich Standardtypen in vielen Programmiersprachen und nichts spezifisches für GraphQL. Eine Ganzzahl ist eine Zahl ohne Dezimalkomma. Ein Gleitkomma- oder Gleitkommazahl ist eine Zahl, die eine Dezimalstelle hat. Eine Zeichenfolge, die wir bereits angesehen haben, ist eine Zeichenfolge oder eine Folge von Zeichen, wie ein Buchstabe, ein Wort oder ein Satz von Texten. Ein boolescher Wert ist ein einfacher „true“ oder „false“ -Wert. Schließlich wird eine ID, die eine eindeutige Kennung ist, oft als eindeutiger Schlüssel für jedes Element in unserer Datenbank verwendet. Wir werden einige davon in einem Augenblick nutzen. Eine andere Sache, die wir oft verwenden werden, ist die Übergabe von Argumenten in unsere Abfragen. Argumente funktionieren auf die gleiche Weise wie das Übergeben von Argumenten in eine reguläre Funktion. Sie stellen einige zusätzliche Informationen bereit, die wir verwenden können. Wir fügen Argumente in Klammern direkt nach dem Abfragenamen hinzu, wie folgt. Unser Film ist unser Abfragename. Jetzt können wir einen Titel für diesen Film übergeben. Auch dies hat einen Typ, den Sie als String festlegen können. Dies hat auch das Ausrufezeichen,
was bedeutet, dass die Zeichenfolge erforderlich ist und die Anzahl des Wertes von null zurückgegeben wird. Das bedeutet, wenn wir die Filmabfrage von den GraphQL-Spielplätzen aufrufen, können
wir auch den Titel null zwei übergeben. Nun, was passiert, wir haben diesen Titel, wenn wir vorbeikommen. Nun, das ist die Aufgabe des Resolvers, damit in irgendeiner Weise umzugehen, die wir wollen. in den Resolvern mit unserem Film zu beginnen, fügen
wir vier Parameter in unsere Resolver-Methode ein. Dies sind übergeordnete, args, context und auch info. Wir werden diese im Laufe des Kurses näher eingehen, aber im Moment werden
wir Argumente verwenden, die kurz für Argumente sind. Auf diese Weise können wir auf diese Argumente zugreifen, z. B. den Filmtitel, den Sie übergeben. Anstatt eine einfache Zeichenfolge zurückzugeben, werde
ich die Backticks verwenden, um ein Template-Literal zurückzugeben, das nur einfaches JavaScript ist, und sagen Sie, mein Lieblingsfilm ist, gefolgt von einem Leerzeichen, und dann muss Dollar-Symbol, um unsere dynamischen Daten zu injizieren. Die Daten, die wir in die Zeichenfolge injizieren möchten, leben auf der args-Eigenschaft. Dies wird Titel genannt, dem Titel übereinstimmt, der als Argument übergeben wurde. Wenn Sie zuvor keine Vorlagenliterale verwendet haben, müssen
Sie anstelle der Zitate die Backticks verwenden. Dann können wir in Klartext mit einer Variablen mischen diese geschweiften Klammern. Auf dem GraphQL-Spielplatz können
wir das jetzt testen. Ich habe den Spielplatz in Chrome geöffnet. Möglicherweise müssen Sie den Server neu starten. Schließen Sie es mit Control C. Dann führen Sie unseren Server erneut mit Knoten, Quelle, index.js aus. Wenn dies läuft und wir können
die GraphQL-Spielplätze aktualisieren , und wir können dies testen. Wir haben den Benutzer noch von vorher. Jetzt müssen wir das ändern, um einen Film zu werden. Wir können nun unsere Argumente innerhalb der Klammern übergeben. Öffnen und schließen Sie die Klammern. Dann können wir unseren Titel übergeben, der wiederum eine Zeichenfolge ist. Wir können hier jeden Filmnamen hinzufügen. Wir möchten dort einen Filmnamen hinzufügen. Dann drücken Sie die Schaltfläche „Play“. Jetzt sehen wir unsere fertige Saite meines Lieblingsfilms ist Wreck-It Ralph. Aber was ist, wenn der Benutzer keinen Titel eingegeben hat? Lassen Sie uns unsere Zeichenfolge entfernen und dann noch einmal „Play“ drücken. Wir sehen jetzt nur den Text von meinem Lieblingsfilm eingegeben ist. Nun, das sieht jetzt ein wenig albern aus, aber der Resolver ist verfügbar, um es in irgendeiner Weise zu handhaben, die wir mit JavaScript wollen. Wir können eine JavaScript-if-Anweisung innerhalb
unseres Resolvers hinzufügen , um zuerst zu überprüfen, ob ein Titel übergeben wurde. Im Inneren unseres Films könnten
wir sagen, wenn args.title. Wenn diese Daten vorhanden
sind, können wir dann unsere return-Anweisung ausschneiden, diese in die if-Anweisung
einfügen. Dies wird ausgeführt, wenn wir einen Titel übergeben haben. Wenn nicht, können wir sagen, return 'Bitte geben Sie Ihren Lieblingsfilm ein... ' Jetzt speichern Sie das. Steuern Sie C, um den Server neu zu starten. Rüber zum Spielplatz, nachladen und jetzt „Play“ drücken. Wir sehen nun den Backup-Text „Bitte geben Sie Ihren Lieblingsfilm ein“. Wir können auch mehrere Argumente in die Abfrage hinzufügen, was ein nützlicher Ansatz bei der Abfrage von Daten ist, wie ein Benutzer innerhalb unseres Schreibtischs. Wenn wir gerade hier zu unserem Benutzer gehen, öffnen und schließen Sie die Klammern kurz danach. Wir können eine Benutzer-ID übergeben und dies ist unsere erste Chance, einen anderen Maßstab Art von ID zu betrachten. Auch hier können wir das Ausrufezeichen verwenden, da dies ein erforderliches Feld ist, das einen Wert zurückgeben wird. Wir können hinzufügen, getrennt durch ein Komma,
ein zweites Argument des Namens. Dies wird eine Zeichenfolge sein. Wir können eine E-Mail hinzufügen. Dies wird auch eine Zeichenfolge sein. Dann unten in unserer Resolver-Methode können
wir die gleichen vier Parameter in unsere Funktion übergeben. Dies ist Elternteil, args, CTX, die kurz für Kontext ist, und unsere Info. Wieder brauchen wir nicht alle vier Argumente sind der Moment. Nun, die Skizze ist in der Gewohnheit, sie zu schreiben, so dass sie vertrauter werden. Da wir eine Benutzer-ID, einen Namen und eine E-Mail übergeben, wäre
es sinnvoll, ein Benutzerobjekt ähnlich wie die Benutzer in unseren Beispieldaten zu erstellen . Würdest du es hier oben sehen? Dies ist also die gleiche Struktur, die wir innerhalb des Resolvers erstellen werden. Zunächst werden wir das Benutzerobjekt basierend auf den Argumenten erstellen. Wir können dies tun, indem wir eine Konstante mit einem Namen
des Benutzers einrichten und dies als unser Objekt festlegen. Wir können die ID genau wie in Beispieldaten dann den Namen und die E-Mail setzen. Die ID wird von Args.id sein. Der Name wird args.name sein. Schließlich wird die E-Mail args.email sein. Diese ID, Name und E-Mail
stimmen auch mit den Argumenten überein, die gerade hier ein bisschen übergeben werden. Zurück nach unten, jetzt anstatt unsere Zeichenfolge zurückzugeben, werden
wir dieses Benutzerobjekt zurückgeben. Gibt uns eine speichern, Control C Server schließen und dann unseren Server neu starten. Zurück zu den Spielplätzen. Wir können das neu laden, um unsere Informationen zu erhalten. Ändern Sie dies, um Benutzer zu sein. Innerhalb unseres Benutzers fügen wir eine ID hinzu. Wir können jede ID hinzufügen, die wir hier wollen, ich werde nur für „123456" gehen. Der Name, die E-Mail. Erstellen Sie hier einfach jede E-Mail. Jetzt können wir „Play“ drücken. Wenn wir jetzt auf dem Spielplatz auf „Play“ klicken, sehen wir einen Fehler statt die Daten, die wir erwarten, dass wir zurückbekommen. Die Fehlermeldung lautet : „String kann keinen Wert darstellen“, gefolgt von unseren Objekten. Möglicherweise haben Sie bereits bemerkt, was das Problem hier ist. Wenn nicht, können wir schauen, ob wir zu unserer Anfrage zurückkehren. Wird in unserer Abfrage für den Benutzer sein, was diese Zeile hier ist. Gleich am Ende geben wir eine Schnur zurück. Aber unser Benutzer ist als Objekt innerhalb unseres Resolvers strukturiert. In den skalaren Typen haben wir uns früher angesehen. Schauen Sie an der Spitze, wir können sehen, das Objekt ist nicht einer der zur Verfügung gestellten skalaren Typen von GraphQL. Dies ist jedoch in Ordnung, da GraphQL es uns ermöglicht,
einen benutzerdefinierten Typ zu erstellen , der als Objekttyp bezeichnet wird. Das ist genau das, was wir als Nächstes abdecken werden.
8. Benutzerdefinierte Objekttypen: Wir haben uns das Problem im letzten Video angesehen, dass oft die Daten, die wir zurück wollen, nicht so einfach sind wie eine Zeichenfolge. Hier kommen Objekttypen ins Spiel. Wie sie klingen, ist ein Objekttyp wie ein Objekt strukturiert und wir können
genau erklären , welche Felder wir
vom Server innerhalb unserer Typaufgaben zurückbekommen , die wir hier haben. Außerhalb dieses Root-Abfragetyps können
wir einen neuen Kundenobjekttyp des Benutzers einrichten. Fügen Sie den Typ Benutzer hinzu und öffnen und schließen Sie dann die geschweiften Klammern, stellen Sie sicher, dass sich diese noch in der Bactik befindet. Dieser Benutzertyp kann jede Struktur enthalten, die wir wollen. In unserem Fall wollten wir die Benutzerstruktur spiegeln, die Sie zuvor verwendet haben, indem Sie die Felder ID, Name und E-Mail hinzufügen. Zuallererst verwenden wir die ID, die eine Art von ID ist. Wir geben einen Namen ein
, der eine Zeichenfolge sein wird. Dann werden wir in der E-Mail übergeben, die wiederum eine Art von String ist. Jetzt in unserer Abfrage direkt oben, anstatt eine Zeichenfolge für den Benutzer zurückzugeben, können
wir jetzt unsere Benutzerobjekte zurückgeben. Auch hier können wir das Ausrufezeichen hinzufügen, das besagt, dass wir keine Nullwerte zurückgeben möchten. Geben Sie diesem ein Speichern, gehen Sie den Server herunter und starten Sie dann neu. Wenn wir keine Fehler haben. Wir können jetzt zurück zu den Graphql-Spielplätzen gehen. Wenn Sie noch die Benutzerabfrage geöffnet haben, können
wir aktualisieren und dann spielen mit der gleichen Abfrage drücken. Diesmal bekommen wir nicht den Fehler, den wir vorher hatten. Stattdessen ist die Fehlermeldung Typ Benutzer muss eine Auswahl von Unterfeldern haben. Dies bedeutet nur, dass wir dem Server mitteilen müssen welche Felder wir von seiner Abfrage zurückerhalten möchten. Kurz nach der Benutzerabfrage können
wir auch einige geschweifte Klammern hinzufügen. Öffnen und schließen Sie diese können nie erklären, welche unserer drei Felder wir zurück wollen. Ich gehe, um die ID hinzuzufügen, ich werde den Namen des Benutzers und auch die E-Mail hinzufügen. Wir können diese Abfrage dann erneut absenden, indem Sie Play oder Befehl oder Control Enter drücken. Dies gibt nun unsere Benutzerdaten als Objekt mit der ID, dem
Namen und der E-Mail zurück , die wir hier angeben. Wir können alle Beträge dieser Felder zurückgeben. Wir müssen nicht alle umsonst zurückgeben. Dies ist einer der Vorteile der Verwendung von graphql. Wir können nur die genauen Daten zurückbekommen, die wir wollen. Wir haben traditionelle APIs, wir könnten alle Daten zurückbekommen, auch wenn es nicht erforderlich ist. Ich werde jetzt einen weiteren objektiven Typ für unseren Film machen. Ich würde Sie ermutigen, dies zuerst zu gehen, bevor Sie entlang folgen, wir werden zuerst einen Objekttyp namens Film erstellen, genau wie wir für den Benutzer nur hören. Mit den Feldern innerhalb von ID und tittle. Ändern Sie dann unsere Abfrage direkt oben, um diesen neuen Typ anstelle einer Zeichenfolge zurückzugeben. Beginnen wir nur mit dem Benutzer. Das wird eine Art Film sein. Wie bereits erwähnt, wird dies die ID als Feld haben, mit der ID als Rückgabewert und dann auch einem Titelfeld, das eine Zeichenfolge zurückgibt. Dann der Move-Resolver knapp darüber, anstatt eine Zeichenfolge zurückzugeben, möchten
wir das Objekt zurückgeben, das wir gerade erstellt haben, das sich bewegt. Fügen Sie auch unsere zweiten Argumente der ID hinzu, die den Typ der ID zurückgeben und diese durch ein Komma trennen wird. zum Film-Resolver
hinuntergehen, können wir auch ein Objekt mit dieser ID und Titel erstellen. Lassen Sie uns die Anweisung von vorher entfernen. Dann können wir unsere Konstanten namens Film-Service erstellen. Dies entscheiden sich, unser Objekt zu sein, das die ID hat. Ich werde die ID von args dot ID durch Komma getrennt greifen, den Titel. Aber Sie Boden auch von Argumenten, so Titel und dann können wir unsere Rückgabezeichenfolge durch das Filmobjekt ersetzen, das wir gerade erstellt haben. Okay, also jetzt zurück zum Terminal,
Kontrolle c, um näher nach unten und dann neu zu starten. Die Spielplätze, wir können das nachladen und wir können das jetzt auf den Spielplätzen testen. Ich werde einen neuen Tab öffnen. Lassen Sie uns nach unserem Film abfragen. Innerhalb des Films können wir den Ausweis übergeben. Jede ID ist in Ordnung. Ich füge eins, zwei, drei hinzu. Dann können wir es im zweiten Argument übergeben, das ist der Titel des Films. Ich füge das geheime Leben der Haustiere hinzu. Genau wie zuvor, wenn wir voran gehen und spielen, werden
wir jetzt sagen, wenn wir eine Auswahl von Unterfeldern aus unserem Film benötigen, die Unterfelder haben die Möglichkeit, ID-Titel so auf einem draußen, beide von ihnen innen hier, dann spielen und wir werden nun mit den Filmdaten, mit der ID und auch dem Titel zurückkehren. Die Verwendung dieser benutzerdefinierten Objekttypen ermöglicht es uns, eine Menge Flexibilität in Bezug auf das Aussehen und Verhalten unserer Daten zu haben. Ich werde diese benutzerdefinierten Typen viel mehr verwenden, während wir für den Rest des Kurses gehen.
9. Mit dem Kontext und Arrays arbeiten: Beginn des Kurses haben wir einige Beispieldaten hinzugefügt, um mit denen zu arbeiten. Dies wird als unsere temporäre Datenbank fungieren, bis wir eine echte Datenbank in einem späteren Abschnitt hinzufügen. Oben in unserem Projekt, in unserer Datei index.js, haben wir unsere Beispieldaten oben in dieser Reihe von Coaches hier aufgenommen . Wir beginnen bei den Usern, den Filmen und den Reviews in ihre eigenen Variablen, und dann unten am Ende der Datei, werden
wir einen Resolver erstellen, wir haben ein Context-Objekt erstellt, das gerade hier ist. Dann haben wir unsere drei Variablen innerhalb übergeben, und so können wir unsere Beispieldaten in den Projekten verwenden. Alles, was wir in den Kontext übergehen, steht allen Resolvern zur Verfügung. Zunächst werde ich eine neue Abfrage einrichten, um alle Filme aus unseren Beispieldaten zu erhalten. Also oben in unserem TypeDefs und dem Abschnitt Abfrage, wollen
wir eine Film-Abfrage einrichten. Die Abfrage dieses Films muss keine Argumente aufnehmen. So können wir einfach eine Art Film zurückgeben. Denken Sie daran, dass der Filmtyp ein benutzerdefiniertes Objekt ist, das wir zuvor erstellt haben. Dieser Ansatz ist jedoch nur teilweise korrekt. Ja, wir wollen einen Filmtyp zurückgeben, aber wir wollen eine Reihe von Filmen nicht nur einen. In GraphQL können wir unseren Filmtyp in
eckige Klammern einschließen , um zu erklären, dass wir wollen, dass dies eine Reihe von Filmen sein. Dieses Array kann auch nicht NULL-fähig sein. Das Hinzufügen eines Ausrufezeichens unmittelbar danach bedeutet, dass wir immer ein Array zurück erwarten können. Wir haben null oder mehr Elemente und keinen Nullwert. Ein Ausrufezeichen nach Film kann auch noch so verwendet werden, wie wir es hier haben. Das bedeutet, dass wir immer erwarten, ein Filmobjekt und nicht einen Wert von null zurück zu bekommen. Wie bei allen Abfragen ist ein Resolver mit dem gleichen Namen erforderlich, das ist die Funktion. So scrollen Sie nach unten. Nach unserem Film können wir auch Filme erstellen. Dies nimmt auch die gleichen vier Parameter. Wir haben Eltern, Argumente, Kontext und Info, und fügen dann ein Komma direkt am Ende hinzu, um dies von unserem Benutzer zu trennen. Der Zweck dieses Resolvers ist es, die Filme aus
unseren Beispieldaten zu holen , die dem Kontext unten gerade hier hinzugefügt wurden. Wir können auf den Kontext in unseren Resolvern zugreifen, indem wir diesen Kontext-Parameter von ctx verwenden. Im Inneren von hier können
wir ctx, gefolgt vom Namen des Kontextes, der Filme, zurückgeben. Zurück zum Terminal können
wir unseren Server neu starten. Sobald dies ausgeführt wird, können wir zum GraphQL-Spielplatz gehen, neu starten, und dann können wir unsere Abfrage erstellen. Also Query, und wir wollen für die Filme abfragen. Dies nimmt keine Argumente, aber da es sich um einen Objekttyp handelt, möchten
wir einige Felder zurückgeben. Ich werde die ID und den Filmtitel zurückgeben und diese Daten dann absenden. Die Titelrückgabe ist die kostenlosen Filme aus dem Film-Array in unseren Beispieldaten. Zurück zu den Abfragen können
wir auch unsere Benutzerabfrage entfernen, die diese Zeile gerade hier ist, da diese für das Projekt nicht mehr benötigt wird. An Ort und Stelle werden wir nach den Benutzern suchen, dies wird ein Array des Benutzertyps zurückgeben, und dann können wir den passenden Resolver erstellen
, der dafür verantwortlich ist, alle Benutzer aus unseren Beispieldaten zu bekommen. So können wir Benutzer ändern, und es ändert sich, um Benutzer zu sein, anstatt die Benutzerobjekte zurückzugeben, werden
wir unsere Benutzer Array aus dem Kontext zurückgeben. Also Benutzer, und es ist Rückkehr von ctx.users. einmal können wir den Server neu starten, auf den Spielplatz
gehen, und in der Tat hat
es eine neue Abfrage von Benutzern geöffnet. Wieder werden keine Argumente übergeben, wir müssen nur die ID zurückgeben, und in der Tat müssen wir dies neu laden, also die ID. Wir haben auch den Namen und der Benutzer hat auch eine E-Mail. Dann haben wir alle Benutzer aus unseren Beispieldaten. Die endgültigen Daten, die wir aus dem Kontext erhalten müssen, sind die Bewertungen. Auch hier möchte ich Sie ermutigen, dies selbst zu versuchen, wenn Sie sich sicher fühlen, denken Sie
daran, dass wir noch keinen benutzerdefinierten Objekttyp für die Überprüfung eingerichtet haben.
Daher müssen wir dies auch tun, damit diese Abfrage funktioniert. Das ist es, was ich jetzt machen werde. Wir können in der TypeDef starten, direkt nach den Benutzern und Filmen. Wir können einen neuen Typ erstellen, die Überprüfung ist. Diese Rezension wird eine ID,
einen Korrespondenten-Film, den Review-Text und auch die Bewertung, die unsere Beispieldaten widerspiegelt. So würde unser Objekt diesem sehr ähnlich aussehen. Wir werden das Feld „Benutzer“ noch nicht hinzufügen. Wir fügen dies zu einem späteren Zeitpunkt hinzu, wenn wir eine Beziehung zwischen den Bewertungen und dem Benutzer erstellen. Also zurück zu unserem Beurteilungstyp. Die ID ist der Typ der ID, der Film. Für jetzt werden wir dies als String hinzufügen. Da dies als String in den Bewertungen gespeichert wird. Als nächstes haben wir den Überprüfungstext. Dies ist auch eine Art von Zeichenfolge, und dann schließlich die Bewertung, die eine Art von Ganzzahl ist, und dann richten wir die Review Query. Scrollen Sie hier nach oben zu unserem Abfragebereich. Wir können in der Beurteilungsabfrage hinzufügen. Genau wie vorher wird dies ein Array des Überprüfungstyps aufnehmen. Jetzt können wir den passenden Resolver direkt nach den Benutzern erstellen. Dieser wird Reviews genannt, die die gleichen vier Parameter von Parent,
Argumente, den Kontext und Info aufnehmen wird. Hier drin müssen wir nur die
context.reviews zurückgeben , um unsere Beispieldaten zu erhalten. Okay, gut. Wir können nun den Server neu starten, zum GraphQL-Spielplatz
gehen. Wir können die Benutzerabfrage entfernen und an Ort und Stelle können wir unseren Abfragetyp für die Bewertungen hinzufügen. Dies nimmt keine Argumente wie die letzten beiden,
alles, was wir tun müssen, ist die Daten zurückzugeben, die wir wollen. Also werde ich die ID, denFilm,
den Rezensionstext
und auch die Bewertung hinzufügen Film,
den Rezensionstext . Schicken Sie das ab. Jetzt erhalten wir eine Reihe von Bewertungen aus unseren Beispieldaten. Wir haben jetzt unsere Arbeit in Operationen eingerichtet, um unsere Benutzer Filme und Bewertungen zu erhalten. Später im Kurs werden wir diese Beispieldaten durch eine echte Datenbank ersetzen. Obwohl dies zunächst für
jeden jetzt komplex erscheinen mag , haben wir gesehen, dass das meiste davon einem ähnlichen Muster folgt. Als nächstes werden wir eine kleine Änderung an unserem Projekt machen, dass automatisch neu unseren Server jedes Mal, wenn wir eine Änderung vornehmen.
10. Automatisches Neustart: Dies wird nur ein schnelles Video sein, um ein npm-Paket namens nodemon zu installieren. Im Moment müssen wir jedes Mal, wenn
wir unsere Dateien ändern, unseren Server schließen und neu starten. Nodemon erspart uns dies, indem die Serverfotos
automatisch neu starten, wenn wir eine Datei speichern. Nodemon ist für weitere Informationen unter nodemon.io verfügbar, aber ich werde dies im Terminal installieren. Lassen Sie uns unseren Server schließen. Dann können wir eine npm install, —save-dev und dann den Paketnamen von nodemon hinzufügen. Drücken Sie „Enter“. Dies wird das Paket von npm einziehen. Der save-dev speichert dies innerhalb unserer package.json als Dev-Abhängigkeit,
was bedeutet, dass dies dies nur während der Entwicklung als Abhängigkeit speichert. Gut. Sobald dies installiert ist, können
wir dies dann im Cyber und der package.json überprüfen und überprüfen. Dies wird als nur Entwicklungsabhängigkeit gespeichert. In der gleichen Datei, scrollen wir nach oben, haben
wir einen Skriptabschnitt gerade hier. Wir können eine neue Start-Skripte hinzufügen, um jetzt die Vorteile von Nodemon zu nutzen. Wir können „Start“ innerhalb der Zitate, gefolgt von einem Doppelpunkt hinzufügen. Npm start wird den Befehl ausführen, den wir als nächstes eingeben. Also, zwischen den Zitaten werde
ich nodemon und dann den Dateipfad zu unserem Server hinzufügen, der src/index.js ist. Fügen Sie kurz danach ein Komma hinzu, um dies von
unserem Testskript zu trennen und dann können wir dieser Datei einen Safe geben. Dies ist ähnlich dem Befehl, den wir zuvor im Terminal ausgeführt haben, um den Server zu starten. Aber jetzt ersetzen wir Knoten durch Nodemon. Jetzt können wir das ausprobieren. Unten im Terminal können wir npm laufen, starten und „Enter“ drücken. Dies führt dann das Skript aus, das wir angegeben haben, das nodemon src/index.js ist. Wieder sehen wir, dass der Server auf localhost-Port 4.000 läuft. Wenn wir nun auf eine unserer Dateien in unserem Projekt gehen und auf „Speichern“
klicken, behalten Sie das Terminal unten im Auge. Wir sehen nun, dass der Server neu gestartet wird,
was bedeutet, dass wir den Server nicht manuell schließen und ihn nach jeder Änderung neu starten müssen. Das ist alles, was wir tun müssen, damit das funktioniert. Als Nächstes werden wir unseren Code umgestalten, um die Dinge besser organisiert zu halten.
11. Refactoring: Selbst in diesem frühen Stadium unseres Projekts können
wir sehen, dass, indem wir alles in der Datei
index.js haben , dieses Ding wieder ein wenig überfüllt ist. Ich werde nicht ein paar Augenblicke dauern, um unsere TypeDefs des Schemas
und auch die Resolver aus dieser Datei zu entfernen und sie in separate Dateien zu organisieren. Beginnend mit unseren TypeDefs, wo chrony wir die Backticks verwenden, um alle unsere Typdefinitionen innerhalb zu erstellen. Wir können diese auch hier herausnehmen und sie in eine separate GraphQL-Datei ablegen. Ich werde diese Datei innerhalb des Quellordners erstellen und dies das Schema.GraphQL
nennen. Wir können dann zu unserem Index zurückkehren und alle unsere Typdefinitionen hier herausschneiden. Schneiden Sie alles, außer den hinteren Zecken. Von der Art der Bewertung, bis hin zu unserer Abfrage, schneiden Sie dies aus. Dann fügen Sie es in unser schema.graphql ein. Zurück in der index.js können
wir die TypeDefs-Zeichenfolge löschen, die wir hier haben und auch unseren Kommentar von oben. zu unserem Server scrollen, müssen
wir jetzt unsere Typdefinitionen ändern, um dies zu widerspiegeln. Wir können die TypeDefs jetzt auf den Speicherort unserer neuen Datei verweisen. Die TypeDefs wird nun gleich einer Zeichenfolge sein. Dies wird ein Punktschrägstrich sein. Wir verwenden den Quellordner und die Datei war schema.graphql. Speichern Sie die Datei und in diesem Stadium sollten Sie vielleicht jetzt vom Spielplatz
gehen und überprüfen, was noch funktioniert. Unser Server wurde automatisch mit Nodemon neu gestartet, so dass wir jetzt die Spielplätze aktualisieren können. Dann können wir unsere Abfragen neu laden und überprüfen, ob wir alle Daten, die wir wollen, anstatt irgendwelche Fehler
zurückbekommen. Das scheint alles gut zu funktionieren. Der nächste Schritt besteht darin, die Resolver in eine neue Datei zu verschieben 2. Auch im Quellverzeichnis werde
ich eine neue Datei namens Resolvers mit der Erweiterung dot js erstellen. Über die index.js können
wir alle unsere Resolvers-Objekt greifen. Lasst uns alles schnappen, einschließlich des const-Namens. Schneiden Sie von der schließenden geschweiften Klammer den ganzen Weg nach oben. Nehmen Sie diese aus unserer Indexdatei und fügen Sie sie in die Resolvers-Datei ein. Dann unten auf der Unterseite der Datei, müssen
wir dieses Resolvers-Objekt exportieren, damit dies funktioniert. Wir haben unsere Datei mit module.exports freigelegt und setzen dies auf unseren Namen der Resolver
, der der Name unseres Objekts oben oben ist, genau hier. Jetzt haben wir diese Datei exportiert, wir können diese jetzt wieder in unserem index.js Backup in unserer Indexdatei verwenden. Im Gegensatz zu unseren Typdefinitionen, wo wir eine Datei direkt übergeben können, genau wie wir hier haben. Wir müssen diese Datei ganz oben benötigen. Wir erstellen eine neue Konstante namens Resolvers und setzen dies auf unseren Dateipfad. So können wir den Dateipfad als String benötigen, der Punktschrägstrich Resolver ist. Dieser Konstname der Resolver stimmt auch mit dem Namen überein, den wir an den Server übergeben haben, der gerade hier ist. Wir müssen keine weiteren Änderungen vornehmen. Das letzte, was ich tun möchte, um unseren Code zu refactorieren, ist, die Filmabfrage zu entfernen. Das brauchen wir für unsere Projekte nicht mehr. So können wir zu unserem Schema innerhalb unseres Abfrageobjekts gehen, entfernt die erste Zeile des Films. Auch in den Resolvern können
wir den passenden Resolver entfernen. Lassen Sie uns den Film finden, wir können all dies aus unserem Abfrageabschnitt entfernen, sagen wir diese Datei. Dies war nur zu Demonstrationszwecken früh im Kurs. Ich werde das für unser Projekt nicht mehr brauchen. Alles, was noch zu tun ist, ist, zurück zu den GraphQL-Spielplätzen zu gehen und testen, ob die Dinge noch funktionieren. So erfrischen. Wir können versuchen, auf einige dieser Anfragen zu klicken. Wir scheinen immer noch die erforderlichen Daten zurück zu bekommen. Mit all dem jetzt erledigt und unser Code ist mehr organisiert. Jetzt können wir zurück zu GraphQL gehen
und entdecken, wie wir Beziehungen zwischen Typen einrichten können.
12. Beziehungen zwischen Typen: Mittlerweile sollten wir ein besseres Verständnis darüber bekommen, wie GraphQL Typen verwendet. Aber das werden wir bald finden. Wir müssen Verknüpfungen oder Beziehungen zwischen diesen Typen einrichten. Auch wenn wir uns erst in der Anfangsphase unseres Projekts befinden, haben
wir bereits die Notwendigkeit, Beziehungen aufzubauen. Die Folie ist die freien benutzerdefinierten Objekttypen, die wir in unseren Projekten haben ,
im Moment sind sie alle unabhängig voneinander, aber so sollte es nicht sein. Wir haben Benutzer, die für die Veröffentlichung von Bewertungen verantwortlich sein werden, daher müssen wir eine Beziehung zwischen dem Benutzer und
dem Review-Typ einrichten und wir können dies tun, indem wir dem Benutzer ein Feld einer Bewertung hinzufügen. Wie wir hier sehen, wird dies eine Reihe von
Bewertungen sein , da ein Benutzer so viele Bewertungen veröffentlichen könnte, wie sie wollten. Darunter haben wir auch den Filmtyp und dies wird auch die gleiche Rezensionen Beziehung zu benötigen. Da die Überprüfung in einem Film ein ganzer Punkt dieses Projekts ist, können
wir in den Bewertungen Felder hinzufügen, und dies ist auch ein Array, da wir mehrere Rezensionen für den gleichen Film haben können. Für den Überprüfungstyp benötigt
dies auch eine Beziehung zu dem Benutzer, der ihn
erstellt hat, und auch zu dem Film, auf dem er basiert. Wir müssen zwei Dinge für diesen Überprüfungstyp tun. Zuallererst müssen wir das Filmfeld von
einem Zeichenfolgenwert in einen Film, einen einzelnen Film,
kein Array ändern einem Zeichenfolgenwert in einen Film, einen einzelnen Film, und schließlichein Benutzerfeld
einrichten, ein Benutzerfeld
einrichten, damit wir wissen, welcher Benutzer diese Bewertung erstellt hat. Jetzt haben wir eine klare Vorstellung davon, wie wir unsere Beziehungen aufbauen können. Lassen Sie uns nun fortfahren, um die Änderungen im nächsten Video zu implementieren.
13. Unsere Beziehungen Teil 1 erstellen: Lassen Sie uns nun an die Arbeit, die Beziehungen für unseren Überprüfungstyp zu erstellen. Wie wir uns bereits angeschaut haben, handelt es sich dabei um zwei Felder. Wenn das Filmfeld geändert wurde, um einen Film anstatt eine Zeichenfolge und
ein neues Feld für den Benutzer zurückzugeben , der ihn erstellt hat. Gehen wir zurück zum schema.graphql in unserem Projekt. In unserer Schemadatei können wir dies ein Feld nach dem anderen tun. Scrollen Sie nach unten zum Review-Typ und zuerst müssen wir das Film-Feld ändern, einen Film anstelle einer Zeichenfolge
zurückgeben. Dies ermöglicht es uns, wenn Abfrage und Bewertungen und auch alle Filmdaten ziehen,
für die es ist , und jetzt gibt es einen weiteren Schritt, den wir im Moment machen müssen, jedes Mal, wenn die Resolver-Dateien für diese Art von Überprüfung, kann
es all dies beheben -Feldern mit skalaren Werten ohne Probleme. Da wir nur eine Zeichenfolge, eine Ganzzahl oder
eine ID zum Beispiel zurückgeben , wenn wir diese Überprüfung abfragen und wir einen Filmtyp finden, ein benutzerdefinierter Objekttyp ist. Wir müssen auch einen separaten Resolver einrichten, damit GraphQL alle Filme durchlaufen kann, die übereinstimmen und den richtigen für die Rückkehr finden kann. Wenn wir diesen Resolver nicht erstellen, hat GraphQL keine Möglichkeit genau zu wissen, welchen Film wir finden möchten. Speichern Sie diese Datei und dann können wir auf
den GraphQL-Spielplatz gehen und wir können versuchen, in unseren Film-Daten hinzuzufügen, um aufgenommen werden. Wenn wir die Reviews Abfrage aktualisieren, drücken Sie spielen, sehen wir den Filmtyp. Nun ist dies nicht mehr eine Zeichenfolge, muss eine Auswahl von Unterfeldern haben. Wir können dies einfach mit den geschweiften Klammern hinzufügen und auch die Film-ID und den Titel hinzufügen. Wie bekomme ich eine Fehlermeldung, die besagt: „Wir können nicht null für ein nicht nullfähiges Feld zurückgeben“, das mit dem Film verwandt ist. Dies liegt daran, dass wir diesen zuvor erwähnten Resolver noch nicht erstellt haben, um die richtigen Filmdaten in der resolvers.jsfile zu erhalten, können wir dies jetzt erstellen. Wir müssen dies als neue Eigenschaft erstellen, die Review genannt wird, um unseren Bewertungstyp zu entsprechen. Fügen Sie nach der Abfrage ein Komma hinzu und
fügen Sie dann den Routenprüfungstyp hinzu und dann nach Methode abgerechnet, genau wie wir es zuvor getan haben, aber der Methodenname muss mit dem Feld aus diesem Überprüfungstyp übereinstimmen. In unserem Fall ist das ein Film. Dies gilt auch für Parameter von Eltern, Argumente, Kontext und Info. Die Verantwortung dieses Resolvers besteht darin, alle Filme in unseren Beispieldaten durchlaufen zu lassen und diejenige mit der ID aus unserer Rezension zu finden. Wir können dies tun, indem Sie die JavaScript-Methode finden. Wir können einen Rückgabewert hinzufügen, also Kontext, werden wir alle Filme durchlaufen. Wo hat die JavaScript-Methode gefunden? Jeder Film findet innerhalb dieser Schleife wird im Variablennamen des Films gespeichert. Diese Find-Methode, die nur reguläres
JavaScript ist , wird diese Funktion für jedes Element im Array ausführen. Jedes Element aus dem Film-Array ist
innerhalb dieser Filmvariablen installiert , die wir hier vorschlagen. Es wird durch, wenn die Film-ID aus unseren Beispieldaten zurückkehren. Gibt die movie.id mit der Film-ID aus der Rezension übereinstimmt zurück. Aber wie greifen wir auf die Film-ID aus der Rezension zu? Wir greifen darauf zu, indem wir einen Parameter verwenden, den wir noch nicht verwendet haben, das ist diese Eltern gerade hier, gefolgt von dem Feldnamen des Films. Wir können überprüfen, ob dies gleich parent.movie ist. In diesem Fall sind Filme ein Kind des Beurteilungstyps. Das übergeordnete Element bezieht sich auf den Resolver um eine Ebene nach oben. Um zu verstehen, wie das besser funktioniert, schauen wir uns an, was in unserem Schema passiert. Betrachtet man unseren Review-Typ, hat
dies, wie wir wissen, viel in Resolver. Wenn Resolver die Werte von id auflösen kann, überprüfen Sie Text und bewerten Sie sofort, da dies alle skalaren Typen sind. Bei diesem Filmtyp wird
es jedoch nicht sofort wissen, welcher Film zurückgegeben werden soll, so dass wir dann diesen separaten Resolver ausführen
, den wir gerade erstellt haben Film. Dieser Film-Resolver ist innerhalb der Rezension verschachtelt und
deshalb müssen wir die Eltern verwenden, um Daten aus dem Review-Typ zu erhalten. Dies mag zunächst ein wenig verwirrend erscheinen, aber wir werden uns ein paar weitere Beispiele dafür ansehen, was helfen sollte. Wenn wir diese Datei nun im Voraus auf dem GraphQL-Spielplatz speichern, können
wir die Bewertungsabfrage erneut ausführen, die Spielplätze
aktualisieren und „Play“ drücken. Jetzt haben wir die entsprechenden Filmdaten
für jede Rezension gefunden , die durch die IDs verknüpft wurde. Lassen Sie uns dies noch einmal tun, aber dieses Mal fügen Sie einen Benutzer zu überprüfen. Oben in der schema.graphql fügen wir
zuerst ein Benutzerfeld zum Überprüfungstyp hinzu. Unten unten, ein neues Benutzerfeld, das einen benutzerdefinierten Objekttyp des Benutzers über in den Beispieldaten zurückgibt. Wenn wir zu den Bewertungen gehen, können
Sie sehen, wir haben bereits einen Benutzertyp auf hier, die mit einer ID des Benutzers verknüpft ist, so 1002, 1001 und dies alle verwenden die IDs von oben. Jetzt müssen wir den Resolver für dieses Benutzerfeld erstellen und der Auftrag dieses Resolvers besteht darin, diese IDs zu vergleichen. Dieser Resolver folgt einem ähnlichen Muster wie das letzte in der Resolvers-Datei. Dieses Benutzerfeld kann auch
dem gleichen Review-Typ hinzugefügt werden , so dass wir dies direkt nach dem Film
hinzufügen können, fügen Sie ein Komma, den Feldnamen des Benutzers, auch
die Eltern, die Argumente, den Kontext und auch die Info. Im Inneren möchten wir einen Rückgabewert hinzufügen
, den Sie den Kontext und das Benutzerarray nachschlagen werden. Dies wird auch die JavaScript-Find-Methode verwenden, um
jedes Element im Array zu durchlaufen und in einem Wert namens user zu speichern. Für jeden Benutzer, der aus dem Array zurückgegeben wird, werden
wir zurückkehren, wenn die Benutzer-ID gleich parents.user ist. Benutzer-ID wird das Feld aus unseren Beispieldaten sein, roh vor allem Benutzer. Die parents.user wird die ID unten in unseren Bewertungen aus diesem Benutzerfeld gerade hier sein. Zurück auf dem Spielplatz für diese Datei speichern, Kopf über und neu laden die Bewertungen können wir auch unsere Benutzer zur Auswahl hinzufügen. Der Benutzer, dies ist auch ein Objekt, so dass wir in einigen Feldern hinzufügen können. Gehen wir einfach nach dem Namen und drücken Sie dann „Enter“. Jetzt haben
wir für jede Überprüfung innerhalb unserer Beispieldaten den Film nachgeschaut und die ID und den Titel eingezogen. Ich habe auch die Übereinstimmung im Benutzer aus unseren Beispieldaten durch die ID gefunden. Dies sind alle Beziehungen, die wir jetzt für den Überprüfungstyp benötigen. Wir werden weiterhin kleine Übungen mit Beziehungen im nächsten Video bekommen, wo wir sowohl den Benutzer als auch den Filmtyp mit den Rezensionen verknüpfen werden.
14. Unsere Beziehungen Teil 2 erstellen: Factorielle Folie von vorher. Wir haben immer noch die beiden Beziehungen auf der linken Seite Setup. Wir müssen den Benutzer mit einer Bewertung verknüpfen, dies ermöglicht es uns, nach Benutzern abzufragen und auch die Bewertungen zu sehen, die sie gemacht haben. Ebenfalls unten, das gleiche Feld für Rezensionen für den Film Typ 2. Dies ermöglicht es uns, nach Filmen abzufragen und dann die Rezensionen für jeden zu sehen. Beide Beziehungen folgen derselben Person aus dem letzten Video, wir fügen ein neues Feld namens Bewertungen hinzu und
erstellen dann einen Resolver, um die Daten zwischen ihm abzurufen. Wieder fügen wir diese neuen Felder in unserem Schema hinzu. Beginnen wir mit der Art des Benutzers. Ganz unten werde ich
ein neues Bewertungsfeld erstellen und dies wird ein Array des Überprüfungstyps sein. Da der Benutzer mehrere Bewertungen platzieren kann, muss
dies ein Array sein. Als nächstes müssen wir einen entsprechenden Resolver einrichten, der mit der Benutzer-ID übereinstimmt. Was werden wir tun, wenn wir einen Blick auf die Beispieldaten werfen? Wenn wir nach unten zu Bewertungen innerhalb der Resolver gehen, wird durch alle Bewertungen mit JavaScript Schleife gehen, und dann die Benutzer-ID für jeden finden. Dies wird mit Bewertungen oder Benutzer zugegriffen werden, wir werden dann überprüfen, ob dies gleich den Eltern ist, die unsere user.id. Sobald Sie ein viel haben, wird
dies wahr zurückgeben und dann die Informationen, die wir brauchen. Jetzt können wir unser Schema speichern und dann zu den Resolvern gehen und diesen Resolver für den Benutzertyp namens Bewertungen erstellen. Wir haben mit den Resolvern für den Überprüfungstyp fertig, gehen
wir zum Ende dieser und erstellen dann eine neue Eigenschaft namens Benutzer. Dies wird ein Objekt sein. Da, wie Sie bereits wissen, können wir hier mehrere Resolver hinzufügen. Wir brauchen nur Bewertungen im Moment, lassen Sie uns den Methodennamen von Bewertungen hinzufügen. Nimm die Eltern, die Argumente, den Kontext und die Info an. Dann ähnlich wie oben, werden
wir eine Methode verwenden, und anstatt die find-Methode zu verwenden, werden
wir die Filtermethode verwenden, da wir mehrere Werte oder mehrere Bewertungen zurückgeben können. Lassen Sie uns den context.reviews.filter zurückgeben. Auch hier ist dies einfach JavaScript, wir werden durch alle Bewertungen filtern und dann unsere Funktion einrichten. Jedes Element in den Rezensionen wird in dieser Review-Variable gespeichert. Was wollen wir hier machen? Nun, genau wie wir uns in den Beispieldaten angeschaut
haben, wollen wir den review.user abgleichen. Wenn Sie dieses Feld nur hier nach unten scrollen, wollen wir es
jetzt mit einer Benutzer-ID abgleichen. Wir können den Benutzer greifen, indem wir überprüfen, ob dies gleich der parents.id
ist. Nun, geben Sie dem einen Sparen und gehen Sie dann zum Spielplatz. Wir können zu unseren Benutzern abfragen, aktualisieren, wenn all dies funktioniert, weil wir das neue Feld noch nicht hinzugefügt haben. Mit nur die E-Mail haben, können wir auch in Bewertungen hinzufügen, innerhalb der Bewertungen müssen wir auch in den Feldern hinzufügen, die zurück wollen. Lassen Sie uns den Rezensionstext und die Rate in hinzufügen und das alles funktioniert gut. Wenn wir diese Informationen zurückbekommen, möchten
wir wahrscheinlich den Filmtitel zu bekommen, also wissen Sie, für welchen Film diese Rezension ist. Wir können das in Bewertungen verschachteln, damit wir auf Film zugreifen können und dann auf die Felder, die wir zurückbekommen wollen? Ich werde nur den Titel hinzufügen und dann innerhalb verschachtelt, wir bekommen auch diesen Titel für jede Rezension. Woher wissen Sie, dass dieser Film funktioniert, wenn er in Rezensionen verschachtelt ist? Nun, das liegt daran, dass du den Resolver dafür bereits im letzten Video eingerichtet hast. Bei der Rückgabe eines Review-Films ist eine Eigenschaft des Reviewtyps. Zurück in unserem Schema können
wir dies sehen, wenn wir zu unserem Review-Typ gehen, wir haben den Film dann haben wir wir haben den Film dann haben wir
einen entsprechenden Resolver, um Film über in der resolvers.js zu holen, und es gibt diese Methode nur hier. Jetzt fangen die Dinge an, sich miteinander zu binden. Ich werde mich jetzt in Beziehungen zwischen unseren Typen bilden. dies vorhanden ist, müssen
wir nur eine letzte Beziehung hinzufügen und das ist auch das gleiche Bewertungsfeld zum Filmtyp hinzuzufügen. Wenn Sie sich sicher fühlen, gehen Sie voran und geben Sie dies auf eigene Faust, es wird Sie darüber nachdenken, wie die Dinge alle zusammenpassen, und Sie können auch mit mir nachher folgen. Beginnen wir mit dem Filmtyp im Schema. Wir werden die gleichen Beurteilungsfelder hinzufügen. Gleich nach dem Titel wird
dies auch den Typ des Arrays zurückgeben. Da der Film mehrere Rezensionen haben kann, Gründen der Einfachheit in diesem Stadium in den Beispieldaten gerade eine einzelne Rezension hinzugefügt, habe
ich aus
Gründen der Einfachheit in diesem Stadium in den Beispieldaten gerade eine einzelne Rezension hinzugefügt,anstatt eine Reihe von mehreren Rezensionen, aber wir werden später mit mehreren Bewertungen umgehen, wenn Sie PRISMA verwenden. Zu den Resolvern haben wir unseren Filmtyp auf der Route eingerichtet. Speichern Sie diese Datei, wir haben unsere Bewertungen, wir haben unsere Benutzer Resolver, und dann als nächstes müssen wir auch
unsere Verschiebe-Resolver einrichten und dies ist ein Objekt und dann fügen wir den Eigenschaftsnamen hinzu. Dies sind die Bewertungen, genau wie über uns in den vier Parametern. Dies wird auch eine Filterübersicht zurückgeben. Gibt ctx.reviews.filter zurück und wir richten unsere Funktion. Hier drinnen werden wir einen Rückgabewert hinzufügen. Genau wie oben werden wir die Überprüfung zurückgeben, aber dieses Mal wollen wir die ID anvisieren. Wenn wir zu unseren Beispieldaten und zu den Bewertungen gehen, werden
wir eine Bewertung nach seiner ID zu holen, und dann werden wir überprüfen, ob dies gleich parents.reviews ist. Eltern werden auf die Filme zeigen und dann die ID auf Bewertungen gespeichert. Sobald wir eine Übereinstimmung zwischen diesen beiden Werten erhalten, werden
wir dann wahr jedes Element in unserem Array zurückgeben. Zurück in Resolvers, lassen Sie uns dies beenden,
überprüfen Sie, ob dies gleich parent.reviews ist, geben Sie dies ein Speichern und dann auf den Spielplatz, wir müssen für die Abfrage für die Filme gehen. Lassen Sie uns den Browser neu laden. Nach dem Titel können wir in den Bewertungen übergeben,
wir können den Rezensionstext, die Bewertung erhalten, und wir können auch überprüfen, welcher Benutzer diese Bewertung als Zugriff auf den Benutzertyp gepostet hat, und wir erhalten den Benutzernamen, drücken Sie Enter und jetzt sehen unsere Ansicht wurde für jeden Film zurückgegeben. Wir haben auch den entsprechenden Benutzer. Wieder, da wir einen Resolver eines Benutzers für die Bewertungen eingerichtet haben, haben
wir dies in unserem Schema getan. Wenn wir zu unserem Überprüfungstyp gehen, haben wir auch diesen Resolver eingerichtet, um den erforderlichen Benutzer zu greifen. Großartig. Da all diese jetzt korrekt funktionieren, dies alle unsere Beziehungen jetzt vorhanden.
15. Einführung in Mutationen: Im letzten Abschnitt konzentrierten
wir uns hauptsächlich darauf, Daten zurückzuholen, die bereits mit Abfragen da waren. Dies stammt aus unseren Beispieldaten. Das wird bald eine echte Datenbank sein. Jetzt wechseln wir die Dinge um und senden die neuen Daten zurück an unsere Datenbank. Diese werden Mutationen genannt und sie können alles senden, was Sie wollen, wie zum Beispiel einen neuen Benutzer, einen neuen Film oder eine neue Rezension. Mutationen folgen einem ähnlichen Muster wie die Abfragen, die Sie bereits verwendet haben. Wir richten die Mutationen, die wir im Schema wollen,
und erklären, welche Art von Daten wir zurückbekommen möchten. Dann haben diese auch viel in Resolver. Ein Resolver pro Mutation. Um zu beginnen, können wir eine neue Stammmutationseigenschaft
zu unserem Schema hinzufügen , derzeit haben wir den Typ, also lassen Sie uns die zweite Wurzeleigenschaft der Mutation wieder als Objekt hinzufügen, so dass wir alle unsere Mutationen zusammen gruppieren können. Wir haben uns das kurz angesehen, als wir die Typ-Entwickler eingerichtet haben. Dies ist eine der drei Stammeigenschaften. Das dritte ist das Abonnement, das auch bald abdecken wird. Dann wie bei den obigen Abfragen fügen
wir den Namen unserer Mutation hinzu, gefolgt von dem Typ, den wir zurückgeben möchten. Ich werde eine Anmeldemutation erstellen, einen Benutzer
registrieren, der den Benutzertyp, Großbuchstabe U zurückgeben wird. Dies kann jede der gleichen Skala von Typen zurückgeben, wie die Zeichenfolge, ein boolescher oder auch unsere benutzerdefinierten Objekttypen, wie diesen Benutzer. Beim Signieren des Benutzers ist
es nicht viel Nutzen, wenn wir keine Daten über den Benutzer weitergeben können,
und wieder, wir können dies leicht tun, indem wir Argumente übergeben. Lassen Sie uns voran und fügen Sie die Klammern nach der Anmeldung hinzu. Wir können einen Benutzernamen hinzufügen
, der eine Art von Zeichenfolge durch Komma getrennt sein wird,
eine E-Mail, auch mit dem Typ der Zeichenfolge, können
Sie feststellen, dass wir nur zwei Argumente an diese Mutation für den Benutzer übergeben. Aber wenn wir unten zum Benutzertyp scrollen, hat
dieser Benutzer vier Felder. Nun, das liegt daran, dass die ID später im Kurs auch von Prisma generiert wird, und es ist nicht etwas, das wir vom Benutzer erwarten würden, da sie eindeutig sein muss. Da die Überprüfungen einen benutzerdefinierten Objekttyp haben, können
sie über einen eigenen Resolver verfügen, um die erforderlichen Daten abzurufen. [ unhörbar] die Resolver für jede Mutation. Speichern Sie diese Datei und gehen Sie dann zu den Resolvern. Mutation ist auch eine Root-Eigenschaft, also werde ich dies nach der Abfrage hinzufügen. Finden Sie die schließende Klammer, die gerade über Überprüfung ist, kann Mutation hinzufügen, als Objekt speichern und ein Komma hinzufügen, trennen Sie diese von Bewertungen. Dies ist ein Objekt, das eine Methode oder einen Resolver für jede Mutation annimmt. Die einzige Mutation, die wir haben, ist signup genannt, und dies nimmt auch die gleichen vier Argumente wie beim Erstellen einer Abfrage, also sind dies Eltern, Argumente, Kontext und Info und dann die geschweiften Klammern. Der Benutzertyp ist ein Objekt, daher müssen wir auch ein Benutzerobjekt erstellen, das der Struktur entspricht. Const, Benutzer, und wir können dies gleich einem Objekt setzen. Das erste Feld ist die ID, und dies wird später auch von Prisma generiert, aber jetzt müssen wir eine erstellen, um in unseren Beispieldaten zu speichern. Wenn wir zu unseren Beispieldaten gehen und dann einen Blick auf das Benutzerobjekt werfen, beginnt
jede ID bei 1.000, also haben wir 1.001, 1.002 und 1.003, so dass wir dieses Muster im Benutzerobjekt anpassen können. Nochmals, mach dir keine Sorgen darüber, was wir hier
tun, sondern nur um eine temporäre ID zu generieren, bis wir Prisma später verwenden. Wir können die ID erstellen, wird eine Vorlagenzeichenfolge sein, so dass wir die Backticks verwenden können. Wir möchten, dass die ID mit einer doppelten Null beginnt, und dann möchten wir, dass dies für jeden Benutzer in unserem Array um eins erhöht wird. Wir können dann die vierte Ziffer dynamisch machen, indem wir sie mit JavaScript übergeben. Wir werden das Benutzerarray mit ctx.users durchlaufen und dann die Länge des Arrays erfassen. Derzeit haben wir drei Benutzer in unseren Beispieldaten. Ich werde dies mit jedem Benutzer, den wir hinzufügen werden, um eins erhöhen. Fügen Sie am Ende ein Komma hinzu und dann können wir voran gehen und die nächsten beiden Felder hinzufügen, die einfacher sind. Wir können den Namen und die E-Mail aus den Argumenten erfassen, wie wir bereits bei der Verwendung von Abfragen gesehen haben. Der Name wird args.name sein. Die E-Mail, args.email, und dann können wir gehen weiter und schieben Sie diesen neuen Benutzer auf unsere Benutzer Array. Schnappen Sie sich die context.users. Wir können dann eine JavaScript-Array-Methode verwenden, um diesen Benutzer zu unseren Beispieldaten zu pushen. Diese Push-Methode ist nur normales JavaScript und nichts spezifisches für GraphQL. Schließlich können wir dann den neuen Benutzer in der nächsten Zeile zurückgeben. Genau wie Anfragen können wir unsere Mutationen auch im GraphQL-Spielplatz testen. Diesmal werde ich einen neuen Tab öffnen. Dies ist die Art der Mutation, also richten wir das so ein, und dann können wir unsere Anmeldung innerhalb hinzufügen. In der Tat werden wir brauchen, um zu aktualisieren. Jetzt, da es auch abgeschlossen ist, so melden Sie sich an. Die Anmeldung wird die Argumente übernehmen. Zuerst haben wir den Namen, also lassen Sie uns hier einen Namen hinzufügen, und auch der zweite war E-Mail. Benutzer, beide Zeichenketten. Sie können alle Daten hinzufügen, die Sie innerhalb von hier für den Benutzer möchten. Dies wird auch eine Art von Benutzer zurückgeben. Wir müssen die ID, den Namen, und wir können auch die E-Mail zu greifen, führen Sie diese. Jetzt ist unsere Anmeldung erfolgreich ausgeführt, wir haben die ID, den Namen und die E-Mail. Wir sehen, dass die ID um den Wert von eins erhöht wurde. Wenn wir erneut „Enter“ drücken, sehen
Sie 1.005 und wieder 1.006, so dass dies für jedes Element im Array um eins erhöht. Lassen Sie uns unsere Benutzerabfrage erneut ausführen und überprüfen Sie, ob diese zusätzlichen Benutzer hinzugefügt wurden. Scrollen Sie nach unten, wir haben unsere kostenlosen Beispieldaten, und dann haben wir die, die wir gerade hinzugefügt haben. Da wir noch keine permanente Datenbank verwenden, werden
alle Änderungen, die Sie an
den Beispieldaten vornehmen , nur im Speicher gespeichert, was sie temporär macht. Wir können den Server neu starten, indem Sie eine beliebige Datei speichern, so Command oder Control S. Zurück zum Spielplatz. Lassen Sie uns neu laden und wir können die Benutzerabfrage erneut ausführen. nun nach unten scrollen, sehen wir nur diejenigen, die in
unseren Beispieldaten gespeichert sind und nicht diejenigen, die wir gerade aus unserer Mutation hinzugefügt haben. In realen Anwendungen würden der Name und die
E-Mail-Argumente vom Frontend bereitgestellt,
z. B. die Anmelde- oder Anmeldeseite einer Website. Aber da die GraphQL für das Backend ist, haben
wir Dinge auf diesem Spielplatz getestet, und das ist alles, was wir tun müssen, damit wir Daten an unseren Server senden können. Als nächstes werden wir ein paar weitere Mutationen hinzufügen, die wir in unseren Projekten benötigen.
16. Film- und Überlegungen: Jetzt haben wir uns angesehen, wie Mutationen funktionieren. Lassen Sie uns jetzt zwei weitere hinzufügen. Eine, um eine Rezension zu erstellen, und eine, um einen neuen Film zu erstellen. Beginnen Sie mit dem Schema mit der Mutation „Film erstellen“. Zurück zu unserem Projekt und dem schema.graphql. Wir werden die gleichen Mutationsobjekte verwenden, die wir bereits für die Anmeldung verwendet haben. Auf der neuen Zeile werde ich das CreateMovie nennen. Diese CreateMovie wird auch einige Argumente übernehmen. In der Tat wird dies ein einzelnes Argument des Titels sein, das vom Typ string sein wird. Wir müssen auch den Rückgabewert festlegen
, der unser benutzerdefinierter Filmtyp sein wird. Über die Resolvers-Datei können
wir den passenden Resolver innerhalb dieses Mutationsobjekts erstellen. Kurz nach der Anmeldung trennen Sie dies mit einem Komma, CreateMovie, indem Sie die Eltern,
die vertrauten Argumente, den Kontext und die Informationen aufnehmen. Nach einem ähnlichen Muster wie die Benutzeranmeldung, werden
wir einen Film Objekte erstellen. Dies wird auch eine ID und einen Titel haben, und noch einmal müssen wir die ID jedes Mal um eins erhöhen, indem wir überprüfen wie viele Filme sich innerhalb
der Beispieldaten befinden und sie dann um eins in jedem Zusatz erhöhen. Die Beispieldaten sollten wir zu den Filmen gehen, wir werden die ID und auch den Titel generieren. Aber momentan werden wir die Bewertungen
leer lassen , da dies später mit Prisma verknüpft wird. Lassen Sie uns voran und erstellen Sie unser Objekt const Film. Dies wird gleich unserer ID-Eigenschaft sein. Erstellen Sie dann die Backticks, um dies zu einem Template-Literal zu machen. Alle IDs für unsere Filme in den Beispieldaten beginnen mit 200, 2001 und 2002. Beginnen wir mit 200, und dann werden wir am Ende den Wert von
context.movies.length hinzufügen und dann diese Array-Länge um eins für jeden Zusatz erhöhen, getrennt durch ein Komma. Als nächstes müssen wir den Titel hinzufügen, was viel einfacher ist, wir können dies von den Argumenten nehmen. Genau wie der obige Benutzer müssen
wir dies auch in das Array ctx.movies,
die JavaScript-Push-Methode, schieben, und dann werde ich unser Filmobjekt schieben. Das letzte, was zu tun ist, diesen Film von dieser Methode zurückzugeben, und dann sind wir gut zu gehen. Rüber zum Spielplatz, lasst uns das testen. Nachladen. Wir haben diese Mutation noch nicht, Filme
zu erstellen, also lassen Sie uns dies zu einem neuen Tab hinzufügen. Erstellen Sie einen Film. Dies nimmt in einem einzigen Argument des Titels, und ich werde einen Filmnamen von The Secret Life Of Pets hinzufügen. Genau so, und dann können wir unsere Werte für den Film zurückgeben. Fügen wir die ID und auch einen Titel und führen Sie das dann aus, und das scheint gut zu funktionieren. Wir haben unsere Daten nun auf der rechten Seite zurückgegeben. Wir können überprüfen, dass dies funktioniert, indem wir alle Filme aus unserer Abfrage holen. Lassen Sie uns das laufen, und unten unten haben wir unseren neuen Film von The Secret Life Of Pets. Großartig. Als nächstes können wir unsere endgültige Mutation abschließen und das ist, um eine neue Überprüfung zu erstellen. Wie immer beginnen wir mit der Einrichtung der Mutation in unserem Schema. Zum schema.graphql können wir eine erste Mutation hinzufügen, die Überprüfung zu erstellen ist. Dies wird die Art der Überprüfung zurückbekommen und es ist erforderlich. Wir müssen auch die Informationen für unsere Überprüfung durch die Argumente übergeben. Ich werde diese auf eine neue Zeile hinzufügen, da es für verschiedene sein wird. Da diese Rezension für einen bestimmten Film sein wird, müssen
wir dies verknüpfen, indem wir eine Film-ID hinzufügen, die ein skalarer Typ von ID ist. Wir müssen auch den Text für die Überprüfung hinzufügen. Ich werde dies als Überprüfungstext hinzufügen, der eine Art von Zeichenfolge ist. Wir müssen auch eine Bewertung hinzufügen, die eine Art von Ganzzahl ist, und dann müssen wir auch diese Bewertung mit dem Benutzer verknüpfen, den wir sie
erstellt haben, indem wir ein Benutzer-ID-Feld hinzufügen. Dies kann auch eine ID zurückgeben, und das ist alles, was wir brauchen, um eine Bewertung zu erstellen. Dann unser passender Resolver direkt nach CreateMovie, fügen Sie am Ende ein Komma hinzu und wir können unseren Resolver für erstellen Review erstellen, nach einem ähnlichen Muster, so Eltern, Argumente, Kontext und Info. Dann richten wir unsere Konstante der Überprüfung ein, die unser Objekt sein wird, das wir konstruieren werden. In einem Beispiel Daten, wenn wir uns die Bewertungen am Ende betrachten, sehen
wir die ID beginnt mit 300. Genau wie die beiden oben genannten Methoden werden
wir unsere ID-Eigenschaft einrichten und diese dann jedes Mal um eins erhöhen. Fangen wir mit 300 an. Wir können dann die Länge des Reviews Arrays mit ctx.reviews.length plus eins erhalten. Die nächste Eigenschaft, die wir brauchen, ist für den Film. Wir können das mit Args.MovieId abholen. Als nächstes haben wir den Überprüfungstext. Dies ist Args.ReviewText. Der nächste ist für die Bewertung, und das ist wieder von den Argumenten, also args.rating. Die letzte ist, diese Bewertung mit einem Benutzer zu verknüpfen, und wir können dies aus der Args.UserID abrufen. Unmittelbar nach diesem Objekt machen
wir unsere beiden vertrauten Dinge. Zuallererst müssen wir dies mit ctx.reviews.push auf das Review-Objekt schieben, indem wir unser Review-Objekt hinzufügen, und dann müssen
wir diese Bewertung von unserer Methode zurückgeben. In einer realen Anwendung wollen
wir das Rating auf einen bestimmten Wert beschränken, sagen wir zwischen Null und fünf. Aber das ist für den Moment in Ordnung, da wir gerade etwas über GraphQL erfahren haben. Geben Sie dieser Datei ein Speichern und dann auf den Spielplatz, wir können dies testen. Laden Sie den Browser neu, öffnen Sie eine neue Registerkarte mit dem Typ der Mutation, und der Name dafür war Create Review. Ich werde dies in einer neuen Zeile hinzufügen, da diese mehrere Argumente beginnen. Die erste war eine Film-ID, und da wir testen wollen, ob das wirklich funktioniert, werden
wir uns eine echte Film-ID holen. aus unseren Beispieldaten Nehmen
wiraus unseren Beispieldaten2002 und fügen Sie dies hinzu. In der nächsten Zeile befindet sich der Überprüfungstext. Dies ist eine Zeichenfolge, so dass wir hier alles hinzufügen können, trennen Sie es durch ein Komma. Die nächste Zeile ist für die Bewertung. Ich werde diesem einen Wert von fünf geben, und dann schließlich die Benutzer-ID, und dies muss wieder einer echten ID innerhalb unserer Beispieldaten entsprechen. Nehmen wir an, Benutzer 1 hat dieses erstellt. Kopieren Sie 1001, fügen Sie dies in hinzu. Kurz nach diesen Klammern müssen
wir auch die geschweiften Klammern hinzufügen, um zu erklären, welche Felder wir zurückbekommen möchten,
die Rezension, die wir in unserer ID zurückbekommen möchten. Wir können auch einen Filmtitel zurückbekommen. Also Film, und dann eines der zurückgegebenen Felder wird der Titel sein, und dann zurück zu unseren normalen Bewertungsfeldern, also ist es der Rezensionstext. Wir können auch die Bewertung erfassen, und dann endlich können wir auch den Benutzer greifen, der diese erstellt hat. Für den Benutzer müssen wir auch einen Auswahlsatz von Feldern zurückbekommen. Ich werde nur nach dem Namen gehen. Lassen Sie uns das testen. Wir haben eine Nachricht „Erwarteter Typ Int; gefunden fünf“. Dies muss nur ohne die Zitate sein. Führen Sie dies erneut aus, und wir haben eine erfolgreich erstellte Rezension, die auch mit dem Film und auch mit dem Benutzer verknüpft ist. Aufgrund der Resolver, die wir zuvor für diese Typen erstellt haben, testen
wir nun die Abfrage auf Überprüfungen. Wir können das erneut ausführen. Lassen Sie uns nach unten scrollen, und wir haben die Rezension, die wir gerade erstellt haben. Das bedeutet, dass alle unsere Mutationen jetzt funktionieren. Wir können Benutzer, Filme und Bewertungen erstellen. Wir erhalten auch alle exakten Daten, die wir von jedem wollen.
17. Abonnements: Früh im Kurs erwähnten wir, dass unsere Typendiagramme Re-Root-Typen haben. Diese Typen sind Abfrage, Mutation und Subskription. Wir haben bereits die ersten beiden abgedeckt. Jetzt werden wir einen Blick darauf werfen, wie Abonnements funktionieren. Wie eine Abfrage ist das Abonnement eine Möglichkeit, die Daten zu erhalten, die wir wollen. Einer der Nachteile einer Abfrage ist jedoch, dass wir nicht immer wissen, ob sich die Daten geändert haben, seit wir sie zurückerhalten haben. Wenn wir sicher sein wollen, müssen
wir die gleiche Abfrage so oft wie nötig machen. Dies ist keine sehr effiziente Art, Dinge zu tun. diesem Grund kommen Abonnements ins Spiel. Wir können einige Daten abonnieren. Jedes Mal, wenn sich die Daten ändern, werden
die neuen Daten an einen Client gesendet,
unabhängig davon, ob es sich um eine Website oder ein mobiles Gerät oder sogar um den GraphQL-Spielplatz handelt. Es tut dies, indem Web-Sockets verwendet wird, um eine offene Verbindung mit dem Client zu halten. Was dies für unser Projekt tun wird, ist es uns erlaubt, die Filmrezensionen zu abonnieren. Jedes Mal, wenn eine neue Rezension veröffentlicht wird, werden
wir benachrichtigt. In einer realen Anwendung könnte
dies mit einem Benutzer verknüpft werden, um sie zu informieren, wenn eine neue Bewertung auf einem Zug gemacht wurde, den sie gefallen haben, oder einfach nur um eine neue Bewertung auf einer Webseite zu öffnen, während sie veröffentlicht werden. Graphql-Yoga kommt auch mit Unterstützung für Abonnements, so dass wir nicht einmal etwas extra installieren müssen, um loszulegen. Diese werden in unserem Projekt mit einem ähnlichen Muster wie die Abfragen und Mutationen eingerichtet. Wir richten das Abonnement im Stammverzeichnis unseres Schemas in unserer Datei schema.graphql und auch einen passenden Resolver für jedes von uns erstellte Abonnement. Beginnen wir also mit dem Schema, in dem wir die Abonnement-Site einrichten. Also, kurz nach Abfrage und Mutation, würde
ich das auf der Route einrichten. Geben Sie also Subskription ein, öffnen Sie die geschweiften Klammern in. Hier folgen wir dem gleichen Muster wie Abfragen und Mutationen, indem wir unserem Abonnement einen Namen geben. Also werde ich diesem einen Namen der Überprüfung geben,
gefolgt von dem Typ, den wir zurückgeben möchten, ein benutzerdefinierter Objekttyp ist. Speichern Sie diese Datei, und dann über in den Resolvern, müssen
wir das Subskriptionsobjekt einrichten. Also werde ich das nach Abfrage und Mutation tun. Fügen wir das hier hinzu. Also Abonnement, Kapital S, also ist es unser Objekt, und fügen Sie dann ein Komma am Ende hinzu. Wie immer muss der Resolver einen übereinstimmenden Namen haben. In unserem Fall ist dies eine Überprüfung. Dann innerhalb dieses Überprüfungsobjekts, verwenden
wir eine Subscribe-Methode. Die Subscribe-Methode übernimmt auch das übergeordnete Element, den argsm, den Kontext und auch die Info. Bei der Arbeit mit Abonnements verwenden
wir ein sogenanntes Publish-Subskriptionsmuster, das
oft Pubsub angezeigt wird. Herausgeber ist der Absender der Nachricht und Abonnent wird unsere Anwendung sein. Wir können eine neue Pub-Sub-Instanz einrichten indem wir diese zuerst aus dem GraphQL Yoga-Modul importieren, und wir tun dies in der index.js. Wir greifen bereits den GraphQL-Server aus dem Yoga-Paket. Also lasst uns auch PubSub schnappen. Dann müssen wir eine neue PubSub-Instanz erstellen, die ich kurz vor dem Server machen werde. Const, werden wir beobachten, und das wird gleich einer neuen PubSub-Instanz genau so sein. Dies ermöglicht es uns, PubsUp in unsere Projekte zu implementieren, und wir können dies tun, indem wir PubSub in den Kontext unten hinzufügen. Also im Inneren befindet sich das Kontextobjekt ganz unten, wir können unsere Instanz von PubSub hinzufügen, so dass dies in allen Resolvern verfügbar ist. Indem wir zu unserem auflösbaren gehen, kann dies nun beenden. Innerhalb der Subskriptionsmethode müssen
wir etwas von PubSub zurückgeben. So können wir ctx.pubsub zurückgeben. Was wir zurückgeben möchten, ist eine Asynciterator-Methode. Also PubSub.Asynciterator. Dieser Asynciterator ist dafür verantwortlich, die Daten an den Subscription-Client zurückzusetzen. Wir haben dies abonniert, indem wir einen Kanalnamen unserer Wahl hinzufügen
, den ich meine neue Rezension nennen werde. Also hier drin hat eine Schnur. Wir fügen einen Kanalnamen der neuen Bewertung, Kapital R und Sie können dies nennen, was Sie wollen. Jetzt haben wir AsynciteRator, der neue Bewertungen zurückgibt. Der nächste Schritt besteht darin, auf die Create-Review-Mutation direkt oben zu gehen, was diese gerade hier ist. Wenn hier eine neue Überprüfung mit diesem Resolver erstellt wird, können
wir diese Daten auch auf dem neuen Review-Kanal veröffentlichen. Wir tun dies erneut, indem wir aus dem Kontext auf PubSub zugreifen. Machen wir es, kurz bevor wir unsere Rezension zurückgeben. Also ctx.pubsub, und dann können wir eine Methode auf pubsub namens Publish aufrufen. Innerhalb dieser Methode geben wir zuerst den Kanalnamen als String ein. Nur um mit dem Kanalnamen von hier übereinzustimmen, werden
wir NewReview verwenden. Nachdem sie dann durch Komma getrennt sind, übergeben
wir ein Objekt mit den Daten, die Sie veröffentlichen möchten, das unser Überprüfungsobjekt von oben ist. Also lassen Sie uns ein Objekt und den Namen der Bewertung hinzufügen, die diesem Überprüfungsobjekt nur hier entspricht. Diese Überprüfung muss mit dem Rückgabetyp aus unserem Schema übereinstimmen. In unserem schema.graphql, wenn wir zu unserem Abonnement gehen, hier geben wir eine Art von Bewertung zurück. Das ist genau das, was wir veröffentlichen, damit die Dinge übereinstimmen. Abonnements können auch auf dem Spielplatz getestet werden, also lassen Sie uns zum Webbrowser gehen und dann neu laden. Lassen Sie uns eine neue Registerkarte für das
Abonnement mit einer ähnlichen Struktur erstellen , die wir bereits für Abfragen und Mutationen verwendet haben. Der Abonnementname ist überprüft, und wir werden eine Art von Bewertung zurückgeben, einschließlich einer ID, einer Bewertung und auch dem Text der Rezension. Wenn wir spielen, sehen wir unten eine Nachricht des Zuhörens bekommen, und er dreht sich in der Mitte. Dies lauscht auf alle neuen Daten, die auf unserem Kanal veröffentlicht wurden, das ist, wenn eine neue Überprüfung gemacht wird. Wir können dies testen, indem wir eine neue Rezension hinzufügen. wir also, der Film ist diesmal 2003. Der Benutzer ist 1003. Sagen wir einfach eine neue Rezension hier, senden Sie diese ab und die Rezension wird erstellt. Zurück zu unserem Abonnement, großartig, unsere neue Rezension ist jetzt im Abonnement angezeigt. Lassen Sie uns einfach eine weitere erstellen, über 2002, neue Rezension 2 sendet dies aus, und unsere zweite Rezension wird nun gezeigt. Wir können die Abonnements auch verwenden, um alle Daten,
die wir wollen, vom Server zu holen , indem wir verschiedene Kanäle erstellen. Sie können genau so eingerichtet werden, wie wir es gerade für Bewertungen getan haben.
18. Prisma Setup: Wir kommen nun zu einem spannenden Teil des Kurses, wo wir anstelle unserer Beispieldaten
eine echte Arbeitsdatenbank implementieren können. Um dies zu tun, verwenden wir einen Dienst namens Prisma, der von prisma.io verfügbar ist. Sie können sich Prisma als Bindeglied zwischen unseren GraphQL-Resolvern und der Datenbank vorstellen. Es befindet sich zwischen unserer Datenbank und dem GraphQL-Server, der den Link erstellt. Es ermöglicht uns, CRUD-Operationen in unserer Datenbank durchzuführen, so dass wir Daten erstellen,
lesen, aktualisieren und löschen können , zusammen mit der Arbeit mit Echtzeitdaten auch. Wir tun dies, indem wir unsere Resolver aktualisieren, um Prisma-Methoden
für die Interaktion mit unserer Datenbank anstelle dessen, was wir gerade tun, einzubeziehen , die aus unserer Beispieldatendatei gedrängt und gelesen wird. Prisma ist kompatibel mit vielen gängigen Datenbanken wie MySQL, Postgre und MongoDB. Es modelliert auch unsere Daten, so dass wir strukturieren können, wie unsere Daten aussehen sollen. Wenn Sie zuvor etwas wie Mongoose verwendet haben, macht
es eine ähnliche Arbeit wie diese. Allerdings ist Prisma besser auf die Arbeit mit der Flexibilität von
GraphQL zugeschnitten und kommt sogar mit einer kostenlosen gehosteten Demo-Datenbank, um Dinge auszuprobieren, und wir werden dies in wenigen Augenblicken einrichten. Um zu beginnen, werde ich die Prisma CLI global vom Terminal installieren. Gehen wir zurück zum VS-Code, innerhalb dieses Terminals können
wir npm i -g ausführen, und diese -g Flanke wird dies global installieren und wir wollen den Paketnamen von
Prisma installieren und diesen Pull in das Prisma-Paket von npm lassen. Die Prisma CLI ist ein Tool zur Verwaltung und Bereitstellung unserer Prisma-Dienste.
Wir werden einige der Befehle verwenden, die sie zur Verfügung stellt, wie zum Beispiel den Befehl init, um unsere Projekte einzurichten. Lassen Sie uns das jetzt ausführen, also prisma init gefolgt von dem Ordnernamen, den Sie hinzufügen möchten, alle unsere Prisma-Dateien und Ordner
darin, was Prisma Prisma genannt wird, und drücken Sie dann die Eingabetaste. Dies wird unsere Initialisierung auslösen, wo wir die Datenbank wählen können, die wir verwenden möchten, wir können eine vorhandene Datenbank verwenden, wenn wir bereits eine haben, wir können eine neue lokale Datenbank mit einem Docker-Container erstellen, oder ich werde die Demo wählen Server, die eine freie Entwicklungsumgebung von Prisma gehostet ist, wählen Sie diese und dann haben wir die Wahl der Regionen, ich werde die nächste zu mir auswählen, drücken Sie Enter. Wir können einen Namen für unseren Service auswählen, ich möchte meine die Film-Review-Datenbank nennen, drücken Sie Enter und dann die Entwicklungsphase. Als nächstes können wir die Sprache der Prisma-Clients auswählen, die wir verwenden möchten Ich werde JavaScript verwenden, also werde ich die Prisma-JavaScript-Clients auswählen. Der Prisma-Client ist eine automatisch generierte Bibliothek, die alle Operationen bereitstellt, die wir benötigen, wenn wir mit unserer Datenbank arbeiten und diese Operationen basieren auf einem Datenmodell,
das wir bald einen Blick auf uns werfen werden. Wir haben einen Ordner namens Prisma erstellt, der
sich hier im Stammverzeichnis unseres Verzeichnisses befindet, also werde ich jetzt CD verwenden, um in den Prisma-Ordner zu wechseln und dann können wir unseren neuen Prisma-Dienst mit dem Prisma-Bereitstellungsbefehl bereitstellen. Fügen Sie Prisma Deploy im Terminal hinzu, Ich habe Enter gedrückt. Geben Sie dem nur ein paar Moment zum Laufen. Wenn wir nach oben scrollen, um etwas mehr Platz zu machen, können
wir sehen, dass unser Service bereitgestellt wurde und wir können auch sehen, dass wir
einen Benutzertyp erstellt haben und wir werden einen Blick werfen, warum dies in nur einem Moment ist und dann nach unten scrollen, wir haben einige Links auf hier, Wenn wir dies öffnen, lassen Sie uns diesen Link kopieren, dies öffnet den Spielplatz, der mit
Prisma verknüpft ist , und fügt ihn dann im Browser hinzu, dies öffnet eine neue Instanz der GraphQL-Spielplätze. Weiter unten, wir haben auch den Link für unsere Datenbank, so können wir diese kopieren, gehen Sie zurück zu Chrome und dann können wir dies in als eine neue Registerkarte einfügen. Dies ist die Benutzeroberfläche für unsere Demo-Datenbank, wir können auf der linken Seite sehen, wir haben eine Art von Benutzer und wir haben noch keine Datensätze eingefügt, also fragen Sie sich vielleicht, warum wir nur diese Art von Benutzer haben oder wir sehen keinen Verweis auf unsere Rezensionen oder Filme. Nun, das liegt an einer Datei namens Datenmodell. Wenn wir die Seitenleiste öffnen, gehen Sie in den Prisma-Ordner, der erstellt wurde, haben
wir eine Datei namens Datenmodell Punkt Prisma. Dieses Datenmodell sieht aus wie das Schema, das wir bereits haben, und Prisma ist so eingestellt, dass ein Standard-Benutzertyp geöffnet wird. Dies ist die Datei, die wir verwenden, um alle
unsere Typen zu strukturieren , die wir in der Datenbank speichern möchten. Diese Datei wird widerspiegeln, wie unsere Datenbanktabellen sein werden. Da wir nur den Benutzertyp haben, sehen wir
deshalb nur den Benutzertyp innerhalb der Demo-Datenbank. Eines der schwierigsten Dinge zu verstehen, wenn zuerst all dies betrachtet, ist, warum wir unsere Typen sowohl in dieser Datei als auch im Schema dot graphQL
erstellen müssen. Nun, es gibt Fälle, in denen diese beiden Dateien ein wenig anders aussehen werden, das Datenmodell, das nur unseren Benutzer hat, beschreibt, was wir in der Datenbank speichern möchten, während das Schema beschreibt, welche Daten dem Client zur Verfügung stehen verwenden. Ein Beispiel dafür, wann diese Dateien anders aussehen werden, ist ein typischer Benutzertyp. Wir würden oft wollen, dass ein Passwort-Feld für den Benutzer in
der Datenbank gespeichert wird , aber wir möchten möglicherweise kein Passwort-Feld in unserem Schema hinzufügen, daher wird dies dem Client zur Verfügung gestellt, da dies ein Sicherheitsrisiko darstellen kann. Da unser Datenmodell nur für die Strukturierung und Gestaltung unserer Daten verantwortlich ist, enthält
es auch keine der Abfragen oder Mutationen, die wir in unserem Schema definiert haben. Also, nur eine Zusammenfassung, unser Schema liefert alle Informationen für unser Front-End oder für unsere Kunden und das Datenmodell spiegelt alles, was wir hier in dieser Datenbank sehen. Zurück in unserem Projekt, auch innerhalb dieses Prisma-Ordners, haben
wir einen generierten Ordner, wenn wir diesen öffnen, haben
wir eine Datei im Inneren namens Prisma-Schema dot js. Wenn wir einen Blick ins Innere werfen, enthält
diese Datei eine Menge Code, der auch von Prisma generiert wurde. Der Prisma-Client hat all dies auf Basis des einzelnen Nutzertyps generiert
, den wir in unserem Datenmodell haben. Sie werden zum Beispiel sehen, Mutationen alle basierend auf dem Benutzer eingerichtet wurden, wie zum Beispiel Benutzer erstellen, Benutzer
aktualisieren und Benutzer löschen. Jetzt werden alle diese Aktionen für uns zur Verfügung stehen, um in
den Resolvern zu verwenden , und dies ist einer der wirklichen Vorteile bei der Verwendung von Prisma. Jedes Mal, wenn wir etwas Neues zu unserem Datenmodell hinzufügen, müssen
wir diese Datei neu generieren und wir werden sehen, wie dies bald zu tun ist. Eine weitere Datei, die hinzugefügt wurde, wenn wir Prisma init ausführen, war die Prisma dot yml Datei. Wenn wir das öffnen, macht es mehr Platz. Dies ist eine Prisma-Konfigurationsdatei, die die Datenbank-Endpunkte an der Spitze hält, was auf unsere Demo-Datenbank verweist, die wir gerade gesehen haben. Dies kann auch für die Datenbanken verwendet werden und dann unten haben
wir den Datenmodelldateiort, der
sich im selben Ordner befindet, dann haben wir am Ende den generierten Abschnitt, dem wir erklären, dass wir der JavaScript-basierte Prisma-Client, um unser Schema automatisch zu generieren und dann schließlich
den Speicherort, in dem diese Datei gespeichert werden soll. Um mit diesem Prisma-Client zu arbeiten, müssen
wir eine Prisma-Client-Bibliothek installieren, unten im Terminal, wir können dies von npm tun, also npm i und der Name des Pakets ist Prisma-clients-lib. Es endet Sets zieht in von npm. Das letzte Setup besteht darin, Prisma in unseren Kontext zu integrieren. Genau wie wir es mit den Beispieldaten getan haben, wird
dies uns erlauben, alles in dieser generierten Datei innerhalb unserer Resolver in
der index dot js-Datei zu nutzen . Damit dies an der Spitze funktioniert, müssen
wir die automatisch generierte Datei benötigen, die wir gerade angeschaut haben und sie in einer Variablen namens Prisma speichern. Also lassen Sie uns eine Konstante namens
Prisma erstellen und dann müssen wir die automatisch generierte Datei benötigen, die wir uns vorher angesehen haben, dies ist in einem Dateiort, der Punkt Punkt Punkt Schrägstrich Prisma vorwärts Schrägstrich generiert und dann Schrägstrich Prisma Client weiterleiten, der der Dateiname ist. Wir müssen dann diese Prisma-Variable in den Kontext hinzufügen, so unten unten unten Bewertungen, können
wir auch Prisma in den Kontext aufnehmen und dass dies uns Zugang zu
Prisma von unseren Resolvern geben wird , und das ist, was wir Blick auf in den kommenden Videos.
19. Aktualisierung unseres Datamodel: Wie wir im vorherigen Video erwähnt haben, die Datenmodelldatei, die Sie hier geöffnet haben, kommt
die Datenmodelldatei, die Sie hier geöffnet haben,standardmäßig mit einem Benutzertyp. Wir müssen nun dieses Datenmodell für unsere Projekte erhalten. Im Moment werden die Benutzerfilm- und Review-Typen die gleichen wie in unserem Schema sein. Wenn Sie zu schema.graphql gehen und dann diese drei Typen kopieren, kopieren Sie die Rezension, den Film und auch den Benutzer, und gehen Sie dann zu unserem Datenmodell, und fügen Sie diese in. Sie können auch den Benutzer entfernen, der standardmäßig bereitgestellt wurde. Sagen wir das. Wir müssen dann die ID-Direktiven hinzufügen, jedes ID-Feld, also @id und dies wird zu unserem ID-Feld auf dem Benutzer sein. Das gleiche für den Film und auch für die Rezension. Diese ID-Direktive muss bei Verwendung von PRISMA zu
einem Feld auf jedem Typ hinzugefügt werden. Eine andere nützliche Direktive ist einzigartig, was für Felder wie unsere E-Mail nützlich ist. Jeder E-Mail-Eintrag in der Datenbank muss eindeutig sein. Wir können dies zu unserem Benutzer hinzufügen, Ihrem besetzten E-Mail-Typ, können
wir @unique hinzufügen. Da wir unser Datenmodell geändert haben, müssen
wir jetzt zwei Dinge tun. Zuerst müssen wir eine PRISMA-Bereitstellung ausführen, um unseren PRISMA-Dienst zu aktualisieren, und wir führen diesen innerhalb des Terminals aus. Wenn wir nach oben scrollen, können wir eine Liste aller
verschiedenen Typen und Felder sehen , die jetzt erstellt,
geändert oder entfernt wurden , zusammen mit allen Beziehungen zwischen ihnen auch. Wir haben auch die Chance, unseren Datenbanklink wieder zu bekommen, und das ist etwas, das Sie nicht im Browser geöffnet haben, indem Sie Müll über den Link unten hinzufügen. Wenn wir jetzt über diesen Link im Browser gehen, werde
ich neu laden. Wir können jetzt über sehen, auf der linken Seite, wir haben einen Benutzer und Film und Rezensionstyp. Das zweite, was wir tun müssen, ist die Regenerierung unserer PRISMA-Schemadatei. Das war die automatisch generierte, die wir uns vorher angesehen haben. Führen Sie im Terminal PRISMA generiert aus, und drücken Sie dann „Enter“. Dadurch wird nun unsere ebenfalls generierte Datei mit den neuen Typen aus dem Datenmodell aktualisiert. Wir können dies sehen, wenn wir die Seitenleiste öffnen und dann in generierte gehen, und dann unser PRISMA-Schema. Hier drinnen, wenn wir nach unten scrollen, gehen wir ein wenig weiter, wir können unsere Art von Film sehen. Wir können viele Filmreferenzen sehen, während wir nach unten gehen, und wenn wir eine Suche nach Mutation machen, sehen
Sie, wie Mutationen hier sind. Wir haben die erstellen, aktualisieren und löschen Film. Dasselbe für die Überprüfung und auch für den Benutzertyp, den wir zuvor gesehen haben. Diese Dateien können ziemlich komplex werden, aber PRISMA hat es mit so ziemlich jeder Operation abgedeckt, die
wir auf unserer Datenbank ausführen müssen. Wir werden dies im nächsten Video beginnen, wo wir beginnen, unsere Resolver zu ändern, um
eine echte Datenbank anstelle der Beispieldaten zu verwenden .
20. In der Datenbank schreiben: Jetzt haben wir unsere Prisma-Operationen generiert, wir werden sie jetzt in unsere Resolver implementieren. Dies ermöglicht es uns, unsere echte Datenbank anstelle
der Beispieldaten-Arrays in der Datei resolvers.ts zu nutzen . Ich werde mit den Mutationen beginnen. Da wir nichts in unserer Datenbank haben, skizzieren
Sie eine Abfrage. Beginnen wir mit dieser Anmeldung Mutation und wir können damit beginnen, unseren Benutzer zu rekonstruieren, um Prisma zu verwenden. Lassen Sie uns unsere Konst des Benutzers einrichten und dann dieses Mal werden wir die context.prisma verwenden. Da wir Prisma auf den Kontext setzen, können
wir auf diese Weise darauf zugreifen. Dann rufen wir eine Prisma-Abfrage auf Mutation nach dem Methodennamen auf. Ich werde die Create-Benutzer-Mutation verwenden. So.Benutzer erstellen. Woher weiß ich, dass es sich um eine Benutzermutation handelt? Da Prisma wird unsere Typen nehmen, wie Benutzer und machen oder erstellen, aktualisieren und löschen Sie eine Version von jedem. Genau wie wir im letzten Video gesehen haben, als wir das Prisma-Schema ausgecheckt haben. Wir haben erstellen, aktualisieren und löschen Versionen unseres Films, Rezension, und auch Benutzer. In diesem generierten Prisma-Schema werden Sie feststellen, dass Prisma die einzelnen Argumente nicht hinzufügt. Zum Beispiel, erstellen Film hat eine Dateneigenschaft und dann zeigt
die State Eigenschaft auf einen neuen Eingabetyp, und auf diese Weise ist nur, um die Dinge ein wenig organisierter zu halten. Wir können auch nach Film suchen, Eingabe erstellen, fügen Sie dies hinzu, und wir können den Eingabetyp nur hier sehen. Hierbei werden eine ID,
ein Titel und etwaige Bewertungen berücksichtigt . Zurück zu unseren Resolvern können
wir ein Objekt einrichten, um unseren Benutzer zu konstruieren. Innerhalb von erstellen Benutzer wie in einem Objekt und dann können wir den Namen hinzufügen
, der gleich args.name ist. Verwenden Sie auch E-Mail, die args.email ist. Wir müssen keine ID hinzufügen. Da dies jetzt automatisch von Prisma generiert wird, so dass wir nichts wie oben. In der Tat können wir diesen const.user tatsächlich entfernen, da wir dieszusammen mit dem Push-Methoden-Tool nicht
mehrbenötigen zusammen mit dem Push-Methoden-Tool nicht
mehr da wir nicht mehr zu den Beispieldaten drängen. Definition dieser Mutation. Ich werde dies in eine asynchrone Funktion verwandeln, indem ich vor der Anmeldung async hinzufüge. Dies ermöglicht es uns, await zu verwenden, kurz bevor wir unseren Benutzer erstellen. Dies ist Standard-JavaScript und nichts spezifisches für GraphQL. Dies bedeutet nur, dass der Code pausiert oder wartet, bis der Benutzer erstellt wurde. Dann schließlich am Ende geben wir den neuen Benutzer mit diesem bekannten Ort zurück, wir können dies testen, um die Datenbank zu pushen, indem wir den Server mit npm start neu starten. Wir können das loslegen und dann nach Chrome gehen, den Spielplatz
öffnen. Wir gehen dann zu unserer Anmelde-Mutation, geben ein und wir bekommen unsere Daten zurück. Dann ist das letzte, was zu tun ist, auf unsere Datenbank zu gehen und neu zu laden. Das sieht vielversprechend aus, dass wir unseren Benutzer haben und wir den Wert eines haben. Wir klicken darauf. Wir sehen dann den Wert, der im grafischen Spielplatz eingegeben wurde, jetzt in unserer Datenbank. Wenn wir auf dieser Benutzerzeile auf der rechten Seite klicken, sehen
wir alle Felder wie Benutzer. Wir haben eine ID, die automatisch generiert wurde, den Namen und die E-Mail. Dann unten haben Sie das Bewertungsfeld und wir werden den Benutzer sehr bald mit den Bewertungen verbinden. Lassen Sie uns voran und erstellen Sie einen neuen Benutzer innerhalb des Spielplatzes. Also gehe ich zu dieser Zeit als Mini-Maus, ändere die E-Mail und schicke diese dann aus, lade sie neu. Jetzt haben wir zwei Benutzer in unserer Datenbank. Jetzt haben wir unsere Benutzer alle arbeiten. Wir wollen das gleiche tun, um Film zu erstellen. Wenn wir nach unten scrollen, haben wir unseren Create-Film-Resolver gerade hier
, den ich genau so konvertieren werde, wie wir es vorher mit den Benutzern getan haben. Also zuerst werde ich das Filmobjekt entfernen, erstellt eine neue Konstante namens Film und die Sequenz gleich dem Kontext oben Prisma. Dann werden wir eine Methode namens Create Movie aufrufen. Sie können ein Objekt aufnehmen. Wir werden den Titel übergeben, gleich
dem args.title sein wird, der vom Spielplatz übergeben wird. Aber ich möchte entfernen, ist Push-Methode. Möchten Sie die return-Anweisung in behalten. Das letzte, was zu tun ist, ist, dies als asynchron zu markieren. Wir können dann pausieren, bis die Daten aus dem Erstellen eines Films zurückkommen. Speichern Sie diese, und dann über auf den Spielplatz, aktualisieren und gehen Sie auf die Mutation, die Film erstellen und senden Sie diese weg. Ich sehe keine Fehler, also ist das gut. Fügen Sie hier auch einen neuen Film hinzu und senden Sie diesen auch aus, laden Sie den Datenbank-Tab neu. Wir sehen zwei Filme in Seite unserer Datenbank, die wir gerade hinzugefügt haben. Großartig. Wir haben jetzt nur noch eine Mutation zu aktualisieren und dies ist eine Rezension erstellen. Wir werden auf dieses im nächsten Video zurückkommen und uns auch die Verbindungsdaten ansehen, zusammen mit der Frage, ob ein Datensatz in der Datenbank existiert.
21. Überprüfen von Data und Verbindungen erstellen: Die CreateReview-Mutation wird ein
wenig tiefer sein als die, die wir bereits erstellt haben. Dies liegt an den Links zu einem Benutzer und einem Film. Vor der Erstellung dieser Überprüfung müssen sowohl der Benutzer als auch der Film tatsächlich in der Datenbank vorhanden überprüfen. Wir müssen auch eine Verbindung zum Benutzer und auch zu den Filmen einrichten, damit wir die Daten zurückbekommen können, die wir brauchen. Beginnen wir mit CreateReview in der Datei resolvers.js. Die Resolvers CreateReview, und wir können damit beginnen, dies zu einer asynchronen Funktion zu machen. Prisma-Clients können wir überprüfen, ob ein Datensatz
in unserer Datenbank existiert , indem wir eine Eigenschaft namens $exist zur Verfügung stellen. Wir können dies verwenden, um eine ID für den Benutzer und den Film zu übergeben,
um zu überprüfen, ob sie beide vorhanden sind, bevor Sie die Rezension erstellen. Lassen Sie uns dies direkt über unserem Bewertungsobjekt tun. Const, wir werden mit dem Benutzer beginnen, wir können Prisma aus dem Kontext zugreifen, dann können wir die $exist Methode verwenden, um zu überprüfen, ob ein Benutzer aus der Benutzertabelle, Ich werde ein Objekt übergeben,
überprüfen, ob der Benutzer ID aus unserer Datenbank stimmt mit der Benutzer-ID aus den args überein, also args.userID. Gleich danach werden wir auch das Gleiche für den Film machen. Müssen nur Konstante genannt Film zu machen, dann können wir Prisma aus dem Kontext zugreifen. Wir können $exists verwenden, aber dieses Mal anstatt der Benutzer, wollen
wir die Filmtabelle in der Datenbank überprüfen. Wir wollen auch überprüfen, ob die Film-ID die gleiche ist wie die auf den Args.MovieID
zur Verfügung gestellt wird. Gut. Jetzt haben Sie diese beiden Variablen, wir können Fehler werfen, wenn eine oder beide nicht existieren. Wir können dies mit einer einfachen if-Anweisung tun, um zu überprüfen, ob der Benutzer nicht existiert. Das Ausrufezeichen wird das Gegenteil tun Wenn der Benutzer
also false zurückgibt, werden
wir dann den Code hier ausführen. Dieser Code wird ein einfacher werfender neuer Fehler mit einer Nachricht einer Zeichenfolge sein, die „user not found“ lautet. Unterhalb dieser meisten möchten eine zweite if-Anweisung hinzufügen,
überprüfen Sie, ob kein Film vorhanden ist. Wenn der Film falsch ist, können
wir einen neuen Fehler werfen, und dieser wird sagen: „Film nicht gefunden.“ Nun, wenn wir direkt unter diese beiden if-Anweisungen gehen, wenn wir zu diesem Stadium kommen, der Benutzer und der Film existieren in der Datenbank. Wir können weitermachen und unsere Überprüfung erstellen. const, review, wir werden diese Datenmarke aus unserer Datenbank erwarten, so ctx.prisma, und dann können wir die Prisma-Methode von CreateReview verwenden. CreateReview wird ein Objekt aufnehmen und dieses Überprüfungsobjekt ähnelt dem, was wir gerade unten erstellt haben, wenn Sie mit Beispieldaten arbeiten. Daher können wir alle Eigenschaften aus diesem Überprüfungsobjekt kopieren. Ich werde die rausschneiden. Wir können diese Konstanten auch löschen und diese in unserer Rezension einfügen. Wir können diese Push-Methode auch entfernen, da wir nicht mehr in unsere Beispieldaten drücken, und auch die ID-Eigenschaft von unserem Objekt, da dies automatisch von Prisma generiert wird. Wenn wir diese Datei speichern und dann den Kopf über zum GraphQL Playground. Lasst uns das neu laden. Dann können wir voran gehen und eine gültige MovieID holen und ID aus unserer Datenbank verwenden. Um jeden Benutzer zu greifen, können
wir die ID über kopieren, fügen Sie dies in. Dann können wir das Gleiche für unseren Film machen. Beides ist in Ordnung, fügen Sie es in die MovieID, dann können wir unsere Mutation ausführen. Wir erhalten einen Fehler zurück. Dies liegt daran, dass wir eine Verbindung zwischen der MovieID herstellen müssen, mit Argumenten
versehen ist, mit einem Film aus der Datenbank und auch dem gleichen für den Benutzer. Prisma ermöglicht es uns, dies einfach zu tun, indem wir einen Stecker verwenden. Wir können dies in unseren Resolvers innerhalb unseres Überprüfungsobjekts einrichten. Für jetzt werde ich nur die args.MovieID schneiden, die geschweiften Klammern
einrichten, und dann können wir in einem Connect-Objekt übergeben. Hier können wir weitergeben, wie wir mit unseren Filmen verbinden wollen, und sobald Sie das ID-Feld verwenden und dann mit dem MovieID aus den Argumenten übereinstimmt. Wir können dies auch für den Benutzer tun, wir können die args.UserID schneiden, die geschweiften Klammern
einrichten und unser Connect-Objekt. Dieses Mal wollen wir auch durch die ID verbinden. Wir verbinden dies mit der Benutzer-ID in den Argumenten zur Verfügung gestellt, geben dies ein Speichern, und dann, wenn wir unsere Überprüfung erneut ausführen, laden Sie den Browser neu, und senden Sie diesen ab. Wir erhalten einen Fehler, können nicht die Eigenschaftenveröffentlichung von undefined lesen, und dies ist in CreateReview. Schauen wir uns das an. Wir haben ctx.publish auf dem Pubsub, das in Ordnung aussieht. Schauen wir uns das einfach in unserem Index an. Sieht aus, als wir den Pubsub gesehen haben, irgendeinen Grund hier. Lass uns das einfach speichern, neu laden und überprüfen, dass das in Ordnung ist. Jetzt bekommen wir diesen Veröffentlichungsfehler nicht mehr. Stattdessen erhalten wir ein nicht null für nicht nullable Feld zurückgeben, das Review.Movie ist. Dieser Fehler wird erwartet. Zunächst einmal, wenn wir zu unserer Datenbank gehen und dann neu laden, sehen
wir, dass wir jetzt unsere Bewertungen haben, die wir gerade hinzugefügt haben, so dass die Mutation tatsächlich funktioniert. Aber das Problem liegt in den Review-Daten, die wir zurückbekommen. Dies liegt daran, wenn wir zu unserer schema.graphql Datei gehen. Dann, wenn wir zu unserer Mutation gehen, hier können wir sehen, dass wir die Art von Review zurückbekommen, scrollen nach unten zu diesem Review-Typ
, der gerade hier ist. Wie wir uns bereits angesehen haben, die skalaren Felder ID, String und Integer einen Wert aus dem Resolver zurück. Sowohl unsere benutzerdefinierten Objekte von Movie als auch Benutzer benötigen einen separaten Resolver, um die Daten zu erhalten, die wir in der Resolvers-Datei benötigen. Wenn wir zu unserem Ansichtstyp scrollen, haben
wir bereits diese beiden Review-Resolver von Film und Benutzer erstellt. Diese suchen jedoch immer noch nach den Stichprobendaten und nicht nach der Prisma-Methode, die wir brauchen. Zunächst einmal können wir diese ändern, indem wir den Code von vorher kommentieren oder löschen. Dann können wir an Ort und Stelle beginnen, dies durch das Prisma-Äquivalent zu ersetzen. Wir können zurückgeben ctx.prisma, und was wir tun wollen, dass wir durch die Bewertungen suchen wollen. Derzeit greifen wir auf die Bewertungen aus unserer Datenbank zu. Der nächste Schritt besteht darin, die aktuelle Bewertung zu finden, indem die ID mit der von den Eltern übereinstimmt. Wir übergeben dies als Objekt, so sehr die ID mit der parent.id. Jetzt haben Sie die Überprüfung aus unserer Datenbank. Wir möchten alle Filme, die mit dieser Rezension verbunden sind, zurückgeben. Dies kann erreicht werden, indem am Ende ein Filmmethodenaufruf verkettet wird. Am Ende können wir die Filmmethode verketten, um alle Filme zu holen, die mit dieser Rezension verbunden sind. Wir können dies mit allen Daten tun, die verwandt sind. Wir verketten effektiv, um die Methoden abzudecken, die wir haben, wie Benutzer, Film
und Überprüfung, und filtern dann die Daten auf jeder Stufe,
wie wir gehen, wie er, wenn der erste Filter nach unten die Bewertungen durch die ID, und dann holen Sie einen Film zugeordnet diese Rezension. Unter diesem Review Typ hat auch eine Beziehung zum Benutzer, so dass wir das gleiche mit diesen beiden tun können. Wir können den Code von vorher entfernen. Dieses Mal werden wir eine ctx.prisma.review zurückgeben. Das wird sehr ähnlich aussehen. Wir werden die Review-ID durchsuchen, die mit der übergeordneten ID übereinstimmt. Der einzige Unterschied dieses Mal besteht darin, dass wir nach
einem entsprechenden Benutzer suchen , indem wir die Benutzermethode am Ende verketten, diese Datei
speichern und dann wieder in die Spielplatz, laden Sie den Browser neu, und dann senden Sie diese aus, und wir können jetzt sehen, unsere Bewertung erstellt wurde. Wenn Sie zu einer Datenbank gehen, ist
diese Rezension auch hier erschienen, und wir können darauf klicken und unsere Ansicht überprüfen. Versuchen wir es noch mal. Wir können in einem anderen Benutzer hinzufügen. Kopieren Sie die Benutzer-ID, fügen Sie diese in ein, und kopieren Sie dann einen gültigen Film. Kopieren Sie diese ID auch, fügen Sie dies innerhalb der Argumente hinzu, und wir können dies ausführen und jetzt erhalten wir die Daten, die wir wollen. Wenn wir unsere Datenbank neu laden, sollten
wir die Überprüfung im Inneren sehen. Alle unsere Mutationen arbeiten jetzt mit Prisma und drängen zu unserer realen Datenbank. Als Nächstes werden wir unsere Abfragen ändern, um auch mit unserer neuen Datenbank zu arbeiten.
22. Daten mit Prisma Teil 1 lesen: Jetzt haben wir bereits ein wenig Erfahrung in der Interaktion mit unserer Datenbank mit Prisma. Das Aktualisieren unserer Abfragen, um unsere Daten zurückzuholen sollte kein allzu großes Problem sein, da es sehr ähnlich ist. Unsere erste Abfrage ist für Filme und ich möchte dies
als asynchron markieren , damit wir wieder Daten von Prisma abwarten können. Dann können wir wieder auf Prisma im Kontext zugreifen und die Film-Methode auswählen. Lassen Sie uns den Code von vor kommentieren und an Ort und Stelle können wir eine neue Konstante namens Filme erstellen. Auch dies erwartet unsere Informationen zurück von ctx.prisma, und rufen Sie die Prisma-Filme Methoden, ziehen alle Filme aus unserer Datenbank, dann können wir unsere Filme am Ende zurückgeben. Ich hätte eine Return-Anweisung und wir können die Filme
zurückgeben und sicherstellen, dass das mit Filmen genau darüber übereinstimmt. Das ist alles, was wir für unsere grundlegende Abfrage tun müssen und wir können dies auf dem Spielplatz testen. Lassen Sie uns den Browser aktualisieren und dann auf die Registerkarte, die für die Filme ist. Dies ist eine Abfrage. Wir können das erneut ausführen und dann haben wir unsere zwei Filme aber dieses Mal von Prisma aus unserer Datenbank gezogen. Wenn wir jedoch
zum Beispiel relationale Daten wünschen , hat der Filmtyp auch Bewertungen. Wenn wir uns diese Bewertungen Eigenschaft ansehen, haben
wir nur ein leeres Array. Dazu müssen wir den Resolver ändern, um auch die Bewertungen abzurufen. Zurück in der Resolvers-Datei, scrollen Sie nach unten. Wir müssen diesen Reviews Resolver reduzieren damit
der Filmtyp mit Prisma funktioniert, genau wie wir es im letzten Video getan haben. Lassen Sie uns den Code von vorher auskommentieren und dann an Ort und Stelle können wir ctx.prisma zurückgeben. Wir werden durch unsere Filme suchen, also suchen wir nach der Film-Methode. Drücken Sie ein Objekt und wir werden für den Film suchen, den Sie durch die ID wollen. Nun, lassen Sie uns die Film-ID mit einem von parents.id zur Verfügung
gestellt.Dann genau wie wir in dem letzten Video sahen wir
auch Kette am Ende unserer Bewertungen Methode, ziehen alle Bewertungen mit diesem bestimmten Film verbunden. Lasst uns das retten. Nun, wenn wir unsere Abfrage erneut ausführen, laden Sie den Browser neu, drücken Sie Enter und jetzt sehen wir für jeden Film haben wir ein Rezensionen Array. Diesmal ist es nicht leer. Es hat alle Bewertungen, die in unserer Datenbank verlinkt sind. Als nächstes haben wir den Benutzer Resolver. also sichern Sie sich an den Anfang der Datei und gehen Sie dann zu den Benutzern. Wir könnten zuerst diese Funktion als asynchrone markieren, Befehle unserer return-Anweisung von vorher
ziehen. An Ort und Stelle können wir eine Konstante namens Benutzer einrichten, die auf ctx.prisma warten wird. Dieses Mal wollen für die Benutzer zu suchen und dann können wir unsere Benutzer zurückgeben. Genau wie zuvor funktioniert dies für einfache Abfragen, die nur skalare Typen zurückgeben. Nun, unsere Benutzer haben auch Bewertungen zu so unten in der Nähe der Unterseite der Datei, müssen
wir den Review-Resolver für den Benutzertyp ändern. Blättern Sie nach unten zu unserem Verwendungstyp. Wir haben einen Reviews Resolver. Im Inneren können wir diese Codezeilen kommentieren oder ausschneiden und dann können
wir dies durch
eine Prisma-Methode ersetzen , die ähnlich aussehen wird wie die, die wir zuvor erstellt haben. Wir werden ctx.prisma zurückgeben. Wir werden nach den Benutzern suchen, ein Objekt
übergeben oder wir können die Benutzer nach der ID filtern. Der Ausweis, gegen den wir überprüfen wollen, ist derjenige, der von den Eltern lebt. Dann können
wir für jeden Benutzer auch alle entsprechenden Bewertungen einziehen indem wir die Bewertungsmethode bis zum Ende verketten. Auf dem Spielplatz können wir das jetzt testen. Wenn wir nach der Registerkarte suchen, die die Abfrage des Benutzers ist, drücken Sie neu laden und dann diese Abfrage absenden. Wir erhalten dann alle Benutzer und die entsprechenden Bewertungen für jeden. Als nächstes haben wir die Reviews Abfrage. Dies wird dem gleichen Muster folgen, so oben auf den Resolvern können wir dies als asynchron markieren, die Return-Anweisungen
auskommentieren und dann können wir alle Bewertungen von Prisma erhalten , also const Reviews. Dies wird auf unsere Daten warten ctx.prisma.reviews und dann unsere Bewertungen unten zurückgeben. Testen Sie dies auf dem Spielplatz, drücken Sie Reload, bis zu unserer Rezensionen Abfrage, senden Sie dies und unsere Bewertungen und kehren Sie jetzt aus der Datenbank zurück. Beachten Sie, wie dieses Mal unsere relationalen Daten, die
der Film so mit Filmtitel hier und ID und auch der Benutzername am unteren Rand ist . Das scheint auch alles zu funktionieren. Dies liegt daran, dass wir die Resolver zu diesen Fällen bereits früher behandelt haben. Wir haben dies in den Resolvers unten im Review-Typ getan. Scrollen Sie nach unten zum Typ der Überprüfung. Wir haben den Benutzer und den Film Resolver an Ort und Stelle. Wir haben sie früher in Benutzer Prisma konvertiert, wenn wir mit
Mutationen arbeiten , so dass sie sich jetzt auch für unsere Abfragen entschieden haben.
23. Daten mit Prisma Teil 2 lesen: Wir sind alle mit der Aktualisierung der bestehenden Abfragen fertig, sie arbeiten jetzt mit Prisma. Aber bevor wir das abschließen, werde
ich eine weitere Abfrage erstellen. Dies ist, um Bewertungen von einem bestimmten Benutzer zu erhalten. Wenn du dich zuversichtlich
fühlst, könntest du das selbst ausprobieren, bevor du mit mir folgst. Seine Struktur folgt dem gleichen Muster wie die anderen Abfragen gerade hier. Ich möchte meine Abfrageüberprüfungen nach Benutzer aufrufen
, der jede Benutzer-ID als einziges Argument verwendet. Dann müssen Sie einen passenden Resolver erstellen, der zuerst prüft, ob der Benutzer existiert und dann alle Bewertungen für diesen bestimmten Benutzer zurückgibt. Okay, also lasst uns in unserem Schema beginnen, indem wir unsere Abfrage hinzufügen. Das ist also schema.graftql. Oben oben mit dem Typ der Abfrage. Wir können Bewertungen von Benutzern hinzufügen. Dies wird als sein einziges Argument annehmen, die Benutzer-ID, die den Typ der ID zurückgibt. Dies ist ein Pflichtfeld, daher verwenden wir das Ausrufezeichen. Ein Benutzer kann mehrere Bewertungen haben, daher wird er ein Array des Überprüfungstyps zurückgeben. Nachdem dies erledigt ist, können wir dies speichern und dann zu den Resolvern für diese Abfrage gehen. Resolver ist.jsfile. Dann nach Bewertungen können wir ein Komma hinzufügen. Ich werde auch diese asynchrone machen. Der Name war Bewertungen von Benutzern, die an zweiter Stelle kommt, die Eltern, die Argumente, die Kontakte und auch die Info. Richten Sie unsere geschweiften Klammern ein. Der erste Schritt besteht darin, zu überprüfen, ob ein Benutzer in unserer Datenbank existiert. Lassen Sie uns eine Konstante namens Benutzer erstellen existiert. Dann warten wir auf die Daten von ctx dot prisma zurück. Ich werde die $ symbol exists -Methode verwenden, um zu überprüfen, ob ein Benutzer durch eine bestimmte ID existiert. Wir können seine ID in das Objekt übergeben,
überprüfen, ob diese ID gleich der von args zur Verfügung gestellten ist, die args dot user ID war. Dann können wir überprüfen, ob der Benutzer in einer bedingten Anweisung existiert. Also, wenn der Benutzer nicht existiert, werden
wir dann einen neuen Fehler werfen. Übergeben einer Fehlermeldung als Zeichenfolge des Benutzers nicht gefunden. In der folgenden Zeile, wenn wir zu dieser Phase kommen, existiert
der Benutzer. Also gehen Sie voran und setzen Sie die Bewertungen ein. Also const Bewertungen, wir werden warten, ctx.prisma. Das erste, was ich tun werde, ist, die Benutzer zu überprüfen und diese nach
der angegebenen ID zu filtern , um Sie alle Benutzer in
der Datenbank zu durchsuchen , die der ID aus den Argumenten entsprechen. So Benutzer-ID. Dann können wir am Ende die Bewertungen dieses bestimmten Benutzers verketten. Der letzte Schritt besteht darin, die Bewertungen zurückzugeben und diese dann auf dem Spielplatz zu testen. Laden Sie den Spielplatz neu, und dann müssen wir eine neue Registerkarte erstellen, um unsere neue Abfrage zu erstellen. Diese Abfrage wurde vom Benutzer als Bewertungen bezeichnet, die Sie in der Benutzer-ID übernehmen werden. Diese Benutzer-ID muss eine gültige ID aus unserer Datenbank sein. Also offensichtlich können die Benutzer, wir können jeden Benutzer auswählen, kopieren Sie die ID, fügen Sie diese in,
in die geschweiften Klammern. Wir müssen auswählen, welche Felder wir zurückbekommen möchten. Wir werden die ID, den Rezensionstext,
die Bewertung und dann auch den Film hinzufügen , mit dem diese Rezension verknüpft ist. Dies ist auch ein Objekt. Also müssen wir es in den geschweiften Klammern übergeben, die Felder, die wir zurück wollen, Unsere Antwort auf Titel hinzufügen. Führen Sie diese Abfrage aus. Wir haben also 1, 2, 3 verschiedene Bewertungen, die mit hübschen Bewertungen in unserer Datenbank übereinstimmen. Ein abschließender Test, wenn wir die Ziffern aus unserer Benutzer-ID entfernen und dann führen wir dies, erhalten
wir unsere Nachricht des Benutzers nicht gefunden. Große Hoffnung, dass Sie es geschafft haben, dies selbst zu gehen. Wenn nicht, mach dir keine Sorgen zu viel. Es ist alles eine gute Lernerfahrung und das ist alles jetzt für unsere Anfragen mit Prisma.
24. Vielen Dank und die nächsten Schritte: Herzlichen Glückwunsch, Sie haben jetzt das Ende dieses Kurses erreicht. Wenn nein, ist dies ein Einführungskurs. Wir haben ziemlich viel Boden besprochen und hoffen, dass Sie viel über GraphQL und Prisma
gelernt haben . Wir begannen damit, was GraphQL ist und einige der Grundlagen wie das Einrichten unseres Servers, Einrichten unserer Typen, Abfragen und Mutationen sowie das Erstellen von Resolvern. Danach haben wir die Beziehungen zwischen
verschiedenen Typen der festgelegten Resolver untersucht , um
unsere relationalen Daten zu erhalten , bevor wir mit Abonnements zu Mutationen und Echtzeitdaten übergehen. Nachdem wir alle diese abgedeckt hatten, zogen
wir auf die Einrichtung einer echten Datenbank und interagierten mit Prisma. Anschließend haben wir unsere Filmreview-Projekte so konvertiert, dass sie mit
dieser Datenbank arbeiten und nicht mit den Beispieldaten, mit denen wir begonnen haben. Inzwischen sollten Sie ein gutes Verständnis davon haben, was GraphQL und Prisma sind und was sie für das Backend unserer Projekte tun können. Sie können es natürlich dort lassen, wenn Sie gerade diesen Kurs besuchen, um GraphQL zu testen. Nun, wenn Sie die Dinge weiter gehen wollen, gibt es ein paar Wege, die Sie einschlagen können. Ein offensichtlicher, aber wirklich effektiver Weg, um bei
GraphQL besser zu werden, besteht darin, einfach mehr Projekte zu erstellen. Nehmen Sie das, was Sie bisher haben, und wenden Sie es auf jedes Projekt an, das Sie genießen. Es könnte ein persönliches Hobby oder Interesse sein, etwas im Zusammenhang mit der Arbeit, oder irgendetwas anderes, was man sich vorstellen kann. Etwas anderes, was Sie tun können, ist, dieses Projekt zu Ihrem eigenen zu machen, indem Sie Änderungen vornehmen. Sie können es personalisieren, indem Sie das Thema
ändern, die Daten ändern, die Sie zurückerhalten, oder indem Sie sogar neue Funktionen hinzufügen. Wenn Sie sich ein wenig selbstbewusster fühlen, können Sie sogar Benutzerauthentifizierung mit einer Anmelde- und Registrierungsmöglichkeit hinzufügen. Sie können eine Funktion hinzufügen, um
Bewertungen zu löschen oder zu aktualisieren oder etwas anderes, was für Sie gut ist. Eine weitere Möglichkeit besteht darin, sich von der Demo-Prisma-Datenbank zu entfernen und Ihre eigene einzurichten. Es gibt einen Link hier zu den Prisma-Dokumenten, die einige Anleitungen dazu haben. Ein weiterer großer Schritt, wird es sein, ein Front-End zu erstellen, um mit unseren Daten zu interagieren. Wir haben das Front-End in diesem Kurs nicht behandelt da GraphQL eine Back-End-verwandte Technologie ist. Aber das ist sicherlich etwas, was es wert ist, zu betrachten. Wir haben den GraphQL-Spielplatz verwendet, um unsere Daten zu erhalten, aber GraphQL ist kompatibel mit fast allen gängigen Frontends, einschließlich React, Vue JS, Angular
und iOS, um ein paar zu nennen, oder hier ist ein Link zur Apollo GraphQL-Dokumentation. Apollo GraphQL hat Implementierungen für die Arbeit mit GraphQL auf dem Server, was es zu einer Alternative zu GraphQL-Yoga macht, die wir in diesem Kurs verwendet haben. Außerdem kann der Apollo Client verwendet werden, um
die Clientseite des Front-Ends Ihrer Anwendung zu erstellen . Wenn Sie zum Menü gehen und den Mauszeiger über die Client-Optionen hier oben bewegen, gibt es Links zu Leitfäden für viele beliebte Front-End-Optionen. Fühlen Sie sich frei, einen Blick auf einige davon zu werfen. Das letzte, was ich Ihnen zeigen möchte, sind diese GraphSQL Boilerplates. Dies sind Boilerplates, die auf Node, Typoskript, React oder Vue basieren. Jeder von ihnen hat drei Ebenen von Boilerplate aus einem einfachen Hello World Beispiel. Zwei erweiterte Funktionen mit Authentifizierung und Datenbanken. Diese sind wirklich nützlich, um als Projektanfang oder sogar nur als Referenz zu verwenden. Das ist es jetzt für den Kurs. Ich hoffe, du hast es wirklich genossen und hoffentlich werde ich dich bald im Kurs sehen.
25. Folge mir auf Skillshare: Ein herzlicher Glückwunsch von mir, dass ich das Ende dieser Klasse erreicht habe. Ich hoffe, Sie haben es wirklich genossen und etwas Wissen daraus gewonnen. Wenn Sie diese Klasse genossen haben, stellen Sie sicher, dass Sie den Rest meiner Klassen hier auf Skill-Anteil überprüfen, und folgen Sie mir auch für Updates und auch alle neuen Klassen informiert werden, sobald sie verfügbar werden. Vielen Dank nochmals, viel Glück, und hoffentlich sehe ich Sie in einer zukünftigen Klasse wieder.