Utiliser Cloud Firestore en mode Datastore

Conçue pour le scaling automatique et les hautes performances, Firestore est une base de données de documents NoSQL qui simplifie le développement d'applications. Il s'agit de la dernière version de Datastore, qui introduit plusieurs améliorations.

Étant donné que Cloud Firestore en mode Datastore est optimisé pour les cas d'utilisation des serveurs et pour App Engine, nous vous recommandons d'utiliser ce mode pour les bases de données qui sont principalement utilisées par les applications App Engine. Firestore en mode natif est particulièrement utile pour les cas d'utilisation de notifications mobiles et en temps réel. Pour en savoir plus sur les modes de Firestore, consultez la page Choisir entre le mode natif et le mode Datastore.

Ce document décrit comment utiliser la bibliothèque cliente Google Cloud pour stocker et récupérer des données dans une base de données en mode Datastore.

Prérequis et configuration

Suivez les instructions de la section "Hello, World!" pour Node.js sur App Engine pour configurer votre environnement et votre projet, et pour comprendre la structure des applications Node.js dans App Engine. Notez et enregistrez votre ID de projet, car vous en aurez besoin pour exécuter l'exemple d'application décrit dans ce document.

Cloner le dépôt

Téléchargez (clonez) l'exemple suivant :

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

Modifier la configuration du projet et définir les dépendances

Dans package.json, définissez @google-cloud/datastore en tant que dépendance, ce qui vous fournit les fonctions permettant d'utiliser le mode Datastore.

{
  "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"
  }
}

Code d'application

L'exemple d'application enregistre, récupère et affiche les adresses IP des visiteurs. Une entrée de journal est une classe simple à deux champs à laquelle est attribué le type visit et qui est enregistrée dans le mode Datastore à l'aide de la commande Dataset save. Ensuite, les dix visites les plus récentes sont extraites par ordre décroissant à l'aide de la commande Dataset runQuery.

'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.');
});

Utiliser des fichiers index.yaml

L'exemple d'application effectue des requêtes simples. Les requêtes Datastore plus élaborées nécessitent un ou plusieurs index, que vous devez spécifier dans un fichier index.yaml à importer avec l'application. Ce fichier peut être créé manuellement ou généré automatiquement lors du test en local de votre application.

Test local

Si vous devez développer et tester votre application en local, vous pouvez utiliser l'émulateur en mode Datastore.

Plus d'informations

Pour obtenir des informations complètes sur le mode Datastore, y compris sur les optimisations et les concepts, consultez la documentation sur Firestore en mode Datastore.