Cloud Firestore im Datastore-Modus verwenden

Firestore ist eine NoSQL-Dokumentdatenbank, die auf Autoscaling, hohe Leistung und einfache Anwendungsentwicklung ausgelegt ist. Es ist die neueste Version von Datastore und bietet einige Verbesserungen.

Da Firestore im Datastore-Modus für Serveranwendungsfälle und für App Engine optimiert ist, empfehlen wir die Verwendung von Firestore im Datastore-Modus für Datenbanken, die hauptsächlich von App Engine-Anwendungen verwendet werden. Firestore im nativen Modus ist besonders nützlich für mobile und Echtzeit-Benachrichtigungs-Anwendungsfälle. Weitere Informationen zu Firestore-Modi finden Sie unter Zwischen nativem Modus und Datastore-Modus wechseln.

In diesem Dokument wird beschrieben, wie Sie mit der Google Cloud-Clientbibliothek Daten in einer Datenbank im Datastore-Modus speichern und abrufen können.

Voraussetzungen und Einrichtung

Folgen Sie der Anleitung unter "Hello, World!" für Node.js in App Engine, um eine Umgebung und ein Projekt einzurichten. Darin erfahren Sie auch mehr über die Strukturierung von Node.js-Anwendungen in App Engine. Notieren Sie sich Ihre Projekt-ID und bewahren Sie sie auf. Sie brauchen diese ID, um die in diesem Dokument beschriebene Beispielanwendung auszuführen.

Repository klonen

Laden Sie das Beispiel herunter bzw. klonen Sie es:

git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples
cd nodejs-docs-samples/appengine/datastore

Projektkonfiguration bearbeiten und Abhängigkeiten festlegen

Legen Sie in package.json @google-cloud/datastore als Abhängigkeit fest. Dies stellt die Funktionen zur Verwendung des Datastore-Modus bereit.

{
  "name": "appengine-datastore",
  "description": "Sample for Google Cloud Datastore on Google App Engine.",
  "version": "0.0.1",
  "private": true,
  "license": "Apache-2.0",
  "author": "Google Inc.",
  "repository": {
    "type": "git",
    "url": "https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git"
  },
  "engines": {
    "node": "16.x.x"
  },
  "scripts": {
    "start": "node app.js",
    "system-test": "mocha --exit test/*.test.js",
    "test": "npm run system-test"
  },
  "dependencies": {
    "@google-cloud/datastore": "^7.0.0",
    "express": "^4.16.4"
  },
  "devDependencies": {
    "mocha": "^9.0.0",
    "supertest": "^6.0.0"
  }
}

Anwendungscode

Mit der Beispielanwendung werden Besucher-IPs geloggt, abgerufen und angezeigt. Ein Logeintrag ist eine einfache Zweifeldklasse, die den Typ visit erhält und mit dem Dataset-Befehl save in Cloud Datastore gespeichert wird. Die zehn zuletzt erfolgten Besuche werden mit dem Dataset-Befehl runQuery in absteigender Reihenfolge abgerufen.

'use strict';

const express = require('express');
const crypto = require('crypto');

const app = express();
app.enable('trust proxy');

// By default, the client will authenticate using the service account file
// specified by the GOOGLE_APPLICATION_CREDENTIALS environment variable and use
// the project specified by the GOOGLE_CLOUD_PROJECT environment variable. See
// https://github.com/GoogleCloudPlatform/google-cloud-node/blob/master/docs/authentication.md
// These environment variables are set automatically on Google App Engine
const {Datastore} = require('@google-cloud/datastore');

// Instantiate a datastore client
const datastore = new Datastore({
  projectId: 'long-door-651',
});

/**
 * Insert a visit record into the database.
 *
 * @param {object} visit The visit record to insert.
 */
const insertVisit = visit => {
  return datastore.save({
    key: datastore.key('visit'),
    data: visit,
  });
};

/**
 * Retrieve the latest 10 visit records from the database.
 */
const getVisits = () => {
  const query = datastore
    .createQuery('visit')
    .order('timestamp', {descending: true})
    .limit(10);

  return datastore.runQuery(query);
};

app.get('/', async (req, res, next) => {
  // Create a visit record to be stored in the database
  const visit = {
    timestamp: new Date(),
    // Store a hash of the visitor's ip address
    userIp: crypto
      .createHash('sha256')
      .update(req.ip)
      .digest('hex')
      .substr(0, 7),
  };

  try {
    await insertVisit(visit);
    const [entities] = await getVisits();
    const visits = entities.map(
      entity => `Time: ${entity.timestamp}, AddrHash: ${entity.userIp}`
    );
    res
      .status(200)
      .set('Content-Type', 'text/plain')
      .send(`Last 10 visits:\n${visits.join('\n')}`)
      .end();
  } catch (error) {
    next(error);
  }
});

const PORT = parseInt(parseInt(process.env.PORT)) || 8080;
app.listen(PORT, () => {
  console.log(`App listening on port ${PORT}`);
  console.log('Press Ctrl+C to quit.');
});

index.yaml-Dateien verwenden

Mit der Beispielanwendung werden einfache Abfragen durchgeführt. Für komplexere Abfragen im Datastore-Modus sind ein oder mehrere Indexe erforderlich. Diese müssen Sie in der Datei index.yaml festlegen, die Sie zusammen mit der Anwendung hochladen. Diese Datei kann manuell erstellt oder automatisch generiert werden, wenn Sie Ihre Anwendung lokal testen.

Lokales Testen

Wenn Sie Ihre Anwendung lokal entwickeln und testen müssen, können Sie den Cloud Datastore-Emulator verwenden.

Weitere Informationen

Umfassende Informationen zum Datastore-Modus, einschließlich Optimierungen und Konzepte, finden Sie in der Dokumentation zu Firestore im Datastore-Modus.