GraphQL- und NodeJS-Integrationen mit Cloud Code Functions

GraphQL bietet API-Entwicklern Zucker, Gewürze und alles, was dazu gehört, aber im Grunde ist es eine Abfragesprache, mit der Sie angeben können, wonach Sie suchen.

Was ist, wenn Sie in Ihrer Anwendung mehr Geschäftsinformationen als das benötigen?

Was ist, wenn Sie zusätzlich noch etwas Logik benötigen?

Was ist, wenn Sie dieses tolle NPM-Modul dazu haben möchten?

Nun, schnallen Sie sich an, denn heute zeige ich Ihnen etwas sehr Mächtiges. Und mit großer Macht kommt große… nun ja… große Zeitersparnis, große Möglichkeiten, große viele gute Sachen…

Wenn Sie mehr über GraphQL wissen wollen, schauen Sie sich diesen Beitrag an: Was ist GraphQL?

Sie müssen so groß sein, um mitfahren zu können…

Und verwenden Sie Parse 3.5.0 oder höher, um mit GraphQL zu spielen.
Gehen Sie zu Servereinstellungen und Parse Server verwalten und stellen Sie sicher, dass Sie eine kompatible Version verwenden.

Unser brandneues glänzendes Feature: GraphQL + Cloud Code Funktionen

Wenn Sie bereits ein Parse/Back4app-Benutzer sind, haben Sie wahrscheinlich schon Cloud Code benutzt oder zumindest davon gehört.

Bei Cloud Code handelt es sich im Wesentlichen um NodeJS-Code, der von den Back4app-Applikationsservern und nicht von den Endgeräten ausgeführt wird.

Dies bringt je nach Ihren Bedürfnissen einige Vorteile mit sich, aber im Wesentlichen können Sie damit:

  • Sparen Sie Handy-Akkus

    Wenn Sie die schwere Last der Verarbeitung vom Gerät in die Cloud verlagern, wird die intensive Verarbeitung nicht auf dem Gerät durchgeführt, was den Akku schont. Sie lassen Ihre Daten auf unseren Servern verarbeiten und rufen nur das Endergebnis für den Kunden ab. Kein heißes Mobiltelefon mehr in der Tasche. Kein “OMG, diese App saugt meinen Akku leer!” mehr.

  • Sparen Sie bei den Datentarifen

    Sie haben also eine große Anzahl von Objekten, die Sie abrufen müssen, um einen Bericht zu erstellen. Tausende? Millionen?
    Das sind eine Menge Daten, die Sie abrufen müssen, und wenn Sie nicht über WiFi verfügen, sollten Sie besser den Datentarif Ihres Handys aufrüsten.
    Wir alle wissen, dass Datentarife ziemlich teuer sind (niemand zahlt mehr für SMS-Nachrichten, oder?), was wäre also, wenn wir einen intelligenteren Ansatz hätten?
    Was wäre, wenn wir den Bericht vollständig in der Cloud berechnen lassen und nur das allerletzte Ergebnis auf das Gerät übertragen würden? Eine kleinere Nutzlast, die viel weniger von Ihrem Datentarif verbrauchen würde und außerdem schneller wäre?
    Klingt genial? Das ist es, was Cloud Code leistet…

  • Schnellerer Code-Einsatz

    Es gab eine Zeit, da mussten Entwickler ihre Software in den App Stores neu veröffentlichen. Damals war das eine Lotterie: Wenn Sie einen schnellen Prüfer haben, ist Ihre App noch am selben Tag für die Benutzer verfügbar. Bei einem langsameren oder pingeligen Prüfer konnte es Wochen dauern, bis Ihre App veröffentlicht wurde. Wenn sie denn veröffentlicht wurde.
    Warum sollte man das riskieren?
    Liefern Sie nur den Frontend-Teil Ihrer Anwendung an die App Stores aus und lassen Sie so viel Logik wie möglich als Cloud-Code abrufbar.
    Müssen Sie eine kleine Änderung an der Logik vornehmen? Oder eine große? Das ist kein Problem.
    Ändern Sie den Cloud-Code, stellen Sie ihn erneut bereit und Sie sind so gut wie neu. Keine Überprüfung durch irgendeinen Typen von irgendwo anders und sofortige Verfügbarkeit für Ihre Kunden.

Aber nochmal… was ist mit GraphQL?

Mit GraphQL können Sie Abfragen stellen. Sie können sehr intelligente Abfragen machen, aber eben nur Abfragen.

Als unser CEO Davi darüber diskutierte, wie man es intelligenter machen kann, erschien die Integration mit Cloud Code Functions nur logisch: Sie haben das Beste aus beiden Welten! Die Leistung und Intelligenz von Cloud Code Functions UND die Einfachheit und Wartungsfreundlichkeit von GraphQL.

Durch unser neues Feature können Sie die Typen von GraphQL erweitern, um Cloud Code Functions auszuführen und deren Ergebnisse abzurufen.

Sie können jede erdenkliche Geschäftslogik auf Ihre Cloud-Code-Funktionen anwenden, NPM-Module mit einbeziehen und alles mit GraphQL abfragen.

Genug geredet. Lassen Sie uns loslegen…

Die Klassen und Objekte, die wir verwenden werden

Für diesen Beitrag habe ich zwei verschiedene Klassen erstellt: Employee und Pet, die die Mitarbeiter hier bei Back4app und ihre jeweiligen Haustiere enthalten werden.

Ein Employee hat die folgenden Eigenschaften:

  • name (Zeichenkette)
  • Alter (Zahl)
  • E-Mail (Zeichenkette)
  • Position (Zeichenkette)
  • hasThisPet (Zeiger auf die Pet-Klasse)

screen-shot-2019-08-07-at-13-18-26

Ein Pet hat die folgenden Eigenschaften:

  • name (Zeichenkette)
  • Art (Zeichenkette)

screen-shot-2019-08-07-at-13-18-37

Und einige Cloud-Code-Funktionen

Für unsere Cloud-Code-Funktionen werde ich eine Datei mit dem Namen main.js schreiben und den folgenden Code einfügen.

Sie enthält fünf vollständig kommentierte Cloud-Code-Funktionen, die Folgendes tun werden:

  • checkGraphQLSupport
    abrufen, ob die App GraphQL-Unterstützung hat
  • retrieveFirstEmployeeByName
    alle Details des ersten in der Datenbank gefundenen Mitarbeiters mit einem bestimmten Namen abrufen
  • retrieveAllEmployees
    liefert alle Details über alle Mitarbeiter
  • retrieveOnwerOfPetByName
    Abrufen der Details eines Mitarbeiters, der ein Haustier mit einem bestimmten Namen hat
  • retrieveEmployeeByNameWithPet
    Abrufen aller Details eines Mitarbeiters und seines Haustiers
Parse.Cloud.define("checkGraphQLSupport", async req => {
  /*
    Diese Funktion gibt zurück, ob die App Unterstützung für GraphQL hat. 
    Der parseGraphQLServer ist true, wenn die App Unterstützung hat, oder false sonst
  */
  if (parseGraphQLServer){
    return "Diese App hat GraphQL-Unterstützung.";
  } else {
    return "Diese App hat keine GraphQL-Unterstützung. Falsche Parse-Version vielleicht?";
  }
});

Parse.Cloud.define("retrieveFirstEmployeeByName", async req => {
  /*
    Diese Funktion ruft den ersten gefundenen Mitarbeiter mit einem bestimmten Namen ab.
    Alle Eigenschaften des Mitarbeiters werden abgerufen.
    Es wird nur ein Mitarbeiter zurückgegeben, wenn es in der Datenbank mehrere gibt.
    Wenn es keine Mitarbeiter gibt, wird null zurückgegeben.
  */
  const query = new Parse.Query("Mitarbeiter"); 
  query.equalTo("name", req.params.name);
  const result = await query.first();
  return result;
});

Parse.Cloud.define("retrieveAllEmployees", async req => {
  /*
    Diese Funktion ruft alle Mitarbeiter ab.
    Es werden alle Eigenschaften der Klasse Employee abgerufen, aber nur diese Klasse.
    Es werden keine Details von Zeigern oder Beziehungen abgerufen, sondern nur die objectId.
    Es wird ein Array von Employees zurückgegeben. Leer, wenn keine Angestellten.
  */
  const query = new Parse.Query("Mitarbeiter"); 
  const results = await query.find();
  Ergebnisse zurückgeben;
});

Parse.Cloud.define("retrieveOnwerOfPetByName", async req => {
  /*
    Diese Funktion ruft die Informationen über den Mitarbeiter ab, der mit einem Haustier verbunden ist,
    anhand des Namens des Haustiers.
    Es werden alle Eigenschaften der Klasse Employee abgerufen.
    Es werden keine Details über das Haustier abgerufen.
    Es wird ein Array von Pet zurückgegeben. Leer, wenn kein Pet gefunden wird.
  */

  // Zuerst erstellen wir eine Abfrage, um die Informationen über das Haustier abzurufen
  const petQuery = new Parse.Query("Pet"); 
  petQuery.equalTo("name", req.params.name);
  
  // Dann erstellen wir eine Abfrage, um die Details des Mitarbeiters basierend auf der Eigenschaft hasThisPet abzurufen
  let employeeQuery = new Parse.Query("Mitarbeiter"); 
  employeeQuery.matchesQuery("hasThisPet", petQuery);
  const results = await employeeQuery.find();

  return results;
  
});

Parse.Cloud.define("retrieveEmployeeByNameWithPet", async req => {
  /*
    Diese Funktion ruft die Informationen über den Mitarbeiter und das zugehörige Haustier ab,
    nach dem Namen des Mitarbeiters.
    Es werden alle Eigenschaften der Klasse Employee und der Klasse Pet abgerufen.
    Es wird ein Array von Employee zurückgegeben, einschließlich einer vollständig ausgefüllten hasThisPet-Eigenschaft
    mit den Informationen über das Haustier.
    Ein leeres Array wird zurückgegeben, wenn kein Employee gefunden wird.
  */
  const query = new Parse.Query("Mitarbeiter"); 
  query.equalTo("name", req.params.name);
  query.include("hasThisPet")
  const results = await query.find();
  Ergebnisse zurückgeben;
});

Wir laden es in unsere Cloud-Code-Funktionen in den Cloud-Ordner hoch.

Ein kleiner zusätzlicher Schritt

Die soeben veröffentlichten Cloud-Code-Funktionen können nun verwendet werden, aber damit sie mit GraphQL funktionieren, müssen wir eine Datei namens schema.graphql erstellen und diese Funktionen offenlegen.

Die Syntax ist sehr einfach, muss aber dennoch beachtet werden:

extend type Query {
 GraphQLMethodName (parameterName: parameterType): ReturnType! @resolve(to:"CloudCodeFunctionName")
}

für den obigen Code stellt die Syntax:

  • GraphQLMethodName
    Dies ist der Name, den Sie in Ihrer GraphQL-Abfrage aufrufen werden. Er muss nicht mit dem Namen der Cloud-Code-Funktion übereinstimmen, aber Sie sollten einen Namen wählen, der es einfach macht, zu verstehen, was diese Methode tut.
  • parameterName
    Der Name des Parameters, den Sie in der Anfrage innerhalb der Cloud Code Function verwenden werden. Sie müssen dies nicht übergeben, wenn Sie keine Parameter in Ihrer Cloud Code Function verwenden.
  • parameterType
    Der Typ des Parameters, den Sie übergeben. Sie können mehr über Schemas erfahren und alle Möglichkeiten sehen. Sie müssen diese Angabe nicht machen, wenn Sie keine Parameter in Ihrer Cloud Code Function verwenden.
  • RückgabeTyp
    Dies ist der Rückgabetyp Ihrer Methode.
  • CloudCodeFunctionName
    Dies muss mit dem Namen der Cloud-Code-Funktion übereinstimmen, die Sie in Ihrer Datei main.js angegeben haben, da der Code über den Funktionsnamen aufgerufen wird.

Für unsere soeben erstellte Datei main.js würde unsere schema.graphql also lauten:

extend type Query {
  checkGraphQLSupport: String! @resolve(to: "checkGraphQLSupport")
  retrieveThisEmployeeByName (name:String): EmployeesClass! @resolve(to: "retrieveFirstEmployeeByName")
  giveMeAllEmployees: [EmployeesClass!]! @resolve(to: "retrieveAllEmployees")
  whichEmployeeIsOnwerOfThisPet (name:String): [EmployeesClass!]! @resolve(to: "retrieveOnwerOfPetByName")
  gatherEmployeeAndPetByEmployeeName (name:String): [EmployeesClass!]! @resolve(to: "retrieveEmployeeByNameWithPet")
}

Ist doch nicht so schwer, oder?

Beachten Sie, dass ich sehr ausführliche Namen verwendet habe, die nicht mit dem Namen der Cloud-Code-Funktionen übereinstimmen, nur damit Sie wissen, dass Sie sie bei der Freigabe umbenennen können.

Gehen Sie nun zurück zum Abschnitt Cloud-Code-Funktionen Ihrer App und laden Sie diese Datei ebenfalls hoch. Stellen Sie sicher, dass sie sich auch im Cloud-Ordner befindet. Sie können sie bei Bedarf dorthin ziehen und ablegen.
Wenn Sie dort bereits eine Datei mit diesem Namen haben und keine neue hochladen können, können Sie mit der rechten Maustaste darauf klicken und sie vor dem Hochladen löschen.

Stellen Sie alles bereit, und schon kann es losgehen:

screen-shot-2019-08-07-at-14-52-49

Jetzt wird es Zeit für die Magie…

Gehen Sie zu Ihrer GraphQL-Konsole. Geben Sie “query” ein und verwenden Sie die Autocomplete-Funktion (STRG + Leertaste unter Windows, OPTION + Leertaste auf dem Mac), und sehen Sie, wie die Magie geschieht:

screen-shot-2019-08-07-at-15-11-36

Alle unsere Methoden sind da und wir können jede einzelne von ihnen abfragen. Versuchen wir es der Reihe nach:

  • checkGraphQLSupport

    (führt zu unserer Cloud Code Funktion checkGraphQLSupport)
    screen-shot-2019-08-07-at-15-14-49

  • retrieveThisEmployeeByName (name:String)

    (führt zu unserer Cloud Code Funktion retrieveFirstEmployeeByName)
    screen-shot-2019-08-07-at-15-19-18

  • giveMeAllEmployees

    (führt zu unserer Cloud Code Funktion retrieveAllEmployees)
    screen-shot-2019-08-07-at-15-21-06
    Beachten Sie im obigen Beispiel, dass die Eigenschaften “Name” und “Alter” korrekt abgerufen wurden, aber “hasThisPet” hat Nullwerte für den Namen und die Art des Haustiers.
    Das liegt daran, dass wir in dieser Cloud Code Function die Informationen über das Haustier nicht einbezogen haben (mit der Methode include()).
    Autocomplete zeigt uns die Möglichkeiten an, aber in der Cloud Code Function wurden keine Daten zum Ausfüllen dieser Informationen bereitgestellt.
    Im folgenden Beispiel von gatherEmployeeAndPetByEmployeeNameresolves sehen Sie, wie Sie Informationen einschließen können.

  • whichEmployeeIsOnwerOfThisPet

    (löst unsere Cloud Code Funktion retrieveOnwerOfPetByName auf)
    screen-shot-2019-08-07-at-15-26-12

  • gatherEmployeeAndPetByEmployeeName 

    (führt zu unserer Cloud Code Funktion retrieveEmployeeByNameWithPet)
    screen-shot-2019-08-07-at-15-28-54

Ihre großartigen Definitionen wurden aktualisiert

So kann man Geschäftslogik in GraphQL einbringen.

Ich liebe dich 3000!

Fazit

GraphQL ist eine leistungsstarke und einfache Multiplattform-Abfragesprache und -Laufzeit, aber letztendlich ist es nur eine Abfragesprache.
Mit dieser brandneuen Integration in Cloud Code Functions haben wir das Beste aus beiden Welten zusammengebracht und die Leistungsfähigkeit von Cloud Code (einschließlich NPM Modules, Baby!) freigesetzt.

Jetzt liegt es an Ihnen und Ihrer Kreativität! Lassen Sie uns in den Kommentaren unten wissen, wie es Ihnen gefällt und wie Sie es in Ihren Projekten einsetzen!

Was ist Cloud Code?

Cloud-Code ist im Grunde Node JS. Er läuft auf den Servern von Back4app statt auf den Endgeräten. Er bietet je nach Bedarf verschiedene Vorteile. Er spart Energie, beschleunigt die Code-Bereitstellung und speichert Daten nach Bedarf.

Wie hilft Cloud Code beim Sparen von Handy-Akkus?

Es hilft, Akku zu sparen, da die Geräte weniger belastet werden. Die Verarbeitungslast, die ständig vom Gerät getragen wurde, wird auf den Cloud-Code verlagert, und das Gerät hat mehr Ruhe als üblich. Dies trägt letztendlich zum Akkusparen bei.

Wie hilft Cloud Code beim Speichern von Daten?

Der Cloud-Code ruft alle Daten ab, die Sie über WLAN oder mobile Daten verarbeitet haben. Er leitet die Daten immer wieder neu ab und berechnet vollständige Berichte in der Cloud. Er ruft nur das letzte Ergebnis auf das Gerät ab, was zu einer geringeren Nutzlast und einem geringeren Datenverbrauch führt.


Leave a reply

Your email address will not be published.