Cloud Datastore mit Node.js verwenden

Auf dieser Seite der Anleitung zu Node.js Bookshelf wird erläutert, wie die Beispiel-App persistente Daten in Google Cloud Datastore speichert. Der Beispielcode für diesen Schritt zeigt, wie in Cloud Datastore gespeicherte Daten erstellt, gelesen, aktualisiert und gelöscht werden können (create, read, update, delete – CRUD).

Diese Seite ist Teil einer mehrseitigen Anleitung. Rufen Sie die Node.js Bookshelf App auf, um die Dokumentation von Anfang an durchzugehen und Anleitungen zur Einrichtung zu erhalten.

Einstellungen konfigurieren

Erstellen Sie im Verzeichnis nodejs-getting-started/2-structured-data eine Datei config.json mit dem folgenden Inhalt:

{
  "GCLOUD_PROJECT": "[YOUR_PROJECT_ID]",
  "DATA_BACKEND": "datastore"
}

Ersetzen Sie [YOUR_PROJECT_ID] durch Ihre Projekt-ID.

Cloud Datastore ist ein vollständig verwalteter Dienst, der automatisch initialisiert und mit Ihrer App Engine-App verbunden wird. Es ist keine weitere Konfiguration notwendig.

Abhängigkeiten installieren

Installieren Sie Abhängigkeiten im Verzeichnis nodejs-getting-started/2-structured-data mit npm:

    npm install

App auf lokalem Computer ausführen

  1. Starten Sie einen lokalen Webserver mit npm:

        npm start
    
  1. Geben Sie im Webbrowser die folgende Adresse ein:

    http://localhost:8080

Sie können jetzt auf den Webseiten der App stöbern und Bücher hinzufügen, bearbeiten und löschen.

App in der App Engine-Standardumgebung bereitstellen

  1. Erstellen Sie die Beispielanwendung aus dem Verzeichnis nodejs-getting-started/2-structured-data:

    gcloud app deploy
    
  2. Geben Sie im Webbrowser die folgende Adresse ein: Ersetzen Sie [YOUR_PROJECT_ID] durch Ihre Projekt-ID:

    https://[YOUR_PROJECT_ID].appspot.com
    

Wenn Sie die App aktualisieren, können Sie die aktualisierte Version mit demselben Befehl bereitstellen, den Sie bei der ersten Bereitstellung der App verwendet haben. Bei der neuen Bereitstellung wird eine neue Version der Anwendung erstellt und zur Standardversion hochgestuft. Die älteren Versionen der App werden beibehalten. Standardmäßig wird die App Engine-Standardumgebung auf 0 Instanzen skaliert, wenn für eine Version kein Datenverkehr eingeht. Ungenutzte Versionen sollten daher nichts kosten. Alle diese App-Versionen bleiben jedoch kostenpflichtige Ressourcen.

Weitere Informationen zur Bereinigung abrechenbarer Ressourcen, einschließlich der App-Versionen, die keine Standardversionen sind, finden Sie im Abschnitt Bereinigen im letzten Schritt dieser Anleitung.

Den Code verstehen

In diesem Abschnitt werden der Anwendungscode und dessen Funktionsweise erläutert.

Nutzereinreichungen mit Formularen verarbeiten

Nutzer können das Formular zum Hinzufügen/Bearbeiten innerhalb der App für Bucheinreichungen verwenden.

Bild des Formulars zum Hinzufügen/Bearbeiten

Das HTML-Formular wird mittels der Node.js-Vorlagen-Engine Pug erstellt. Die folgende Pug-Vorlage gibt an, dass das Formular Texteingabefelder für "Titel", "Autor", "Erscheinungsdatum" und "Beschreibung" enthält:

block content
  h3 #{action} book
  form(method="POST")
    .form-group
      label(for="title") Title
      input.form-control(type="text", name="title", id="title", value=book.title)
    .form-group
      label(for="author") Author
      input.form-control(type="text", name="author", id="author", value=book.author)
    .form-group
      label(for="publishedDate") Date Published
      input.form-control(type="text", name="publishedDate", id="publishedDate", value=book.publishedDate)
    .form-group
      label(for="description") Description
      input.form-control(type="text", name="description", id="description", value=book.description)
    .form-group
    button.btn.btn-success(type="submit") Save

Formulareinreichungen verarbeiten

Wenn ein Nutzer auf Buch hinzufügen klickt, wird er durch den folgenden Code in books/crud.js zur Seite /add der Anwendung geleitet. Diese enthält das Formular zum Hinzufügen bzw. Bearbeiten.

router.get('/add', (req, res) => {
  res.render('books/form.pug', {
    book: {},
    action: 'Add'
  });
});

Wenn ein Nutzer das Formular Buch hinzufügen ausfüllt und auf Speichern klickt, wird durch den folgenden Code in books/crud.js die Aktion HTTP POST des Formulars verarbeitet. Dadurch wird der Vorgang gestartet, bei dem die eingereichten Daten durch Übergabe an die model.create-Funktion an Cloud Datastore gesendet werden.

router.post('/add', (req, res, next) => {
  const data = req.body;

  // Save the data to the database.
  getModel().create(data, (err, savedData) => {
    if (err) {
      next(err);
      return;
    }
    res.redirect(`${req.baseUrl}/${savedData.id}`);
  });
});

Die Datei books/model-datastore.js enthält den Code, der CRUD-Funktionen für in Cloud Datastore gespeicherte Daten ausführt. Die Anweisung model.create ruft beispielsweise die Funktion create in model-datastore.js auf, die die vom Nutzer übermittelten Daten verwendet, um eine neue Bucheinreichung zu erstellen.

module.exports = {
  create,
  read,
  update,
  delete: _delete,
  list
};

Dies ist die Funktion update, mit der die vom Nutzer übermittelten Daten in Cloud Datastore gespeichert werden. Die Hilfsfunktionen toDatastore und fromDatastore dienen zur Übersetzung der eingereichten Daten des Nutzers aus dem App-Format in das Format für erweiterte Entitätsattribute von Cloud Datastore.

function update (id, data, cb) {
  let key;
  if (id) {
    key = ds.key([kind, parseInt(id, 10)]);
  } else {
    key = ds.key(kind);
  }

  const entity = {
    key: key,
    data: toDatastore(data, ['description'])
  };

  ds.save(
    entity,
    (err) => {
      data.id = entity.key.id;
      cb(err, err ? null : data);
    }
  );
}

Wenn Nutzer Bücher hinzugefügt haben, wird durch Klicken auf den Link Bücher die Seite /books aufgerufen. Dort sind alle derzeit in Cloud Datastore gespeicherten Bücher aufgeführt. Die Seite verwendet die Datei books/model-datastore.js, die einen Cloud Datastore-Client mit dem Namen ds initialisiert und die Variable kind auf Book setzt. Dies ist die Art der Entität, die das Modell verwaltet.

const ds = Datastore({
  projectId: config.get('GCLOUD_PROJECT')
});
const kind = 'Book';

Danach listet die Funktion list mithilfe der aus Cloud Datastore abgerufenen Daten alle Bücher auf. Durch die Anweisung const q = ds.createQuery([kind]) wird eine Abfrage namens q erstellt, durch die alle Bücher im Datenspeicher ausgewählt werden. Der Abfrage werden die folgenden zusätzlichen Attribute hinzugefügt:

  • Mit .limit(limit) wird die maximale Anzahl von Ergebnissen festgelegt, die pro Seite zurückgegeben werden sollen.
  • Mit .order('title') wird angegeben, dass die Ergebnisse alphabetisch nach dem Buchtitel angeordnet werden sollen.
  • Mit .start(token) wird der Startpunkt für die Seitenaufteilung angegeben und basierend auf dem Wert von token können weitere Seiten angefordert werden.

Anschließend wird durch Aufrufen von ds.runQuery die Abfrage ausgeführt. Dabei repräsentiert das Abfrageobjekt q als erster Parameter die auszuführende Abfrage. Der zweite Parameter von ds.runQuery ist ein Callback, der mit den Argumenten (err, entities, nextQuery) aufgerufen wird. Schließlich wird der Callback cb der Funktion list mit den Argumenten (err, books, nextPageToken) aufgerufen.

function list (limit, token, cb) {
  const q = ds.createQuery([kind])
    .limit(limit)
    .order('title')
    .start(token);

  ds.runQuery(q, (err, entities, nextQuery) => {
    if (err) {
      cb(err);
      return;
    }
    const hasMore = nextQuery.moreResults !== Datastore.NO_MORE_RESULTS ? nextQuery.endCursor : false;
    cb(null, entities.map(fromDatastore), hasMore);
  });
}
Hat Ihnen diese Seite weitergeholfen? Teilen Sie uns Ihr Feedback mit:

Feedback geben zu...