Como usar o Cloud Firestore no modo Datastore

O Firestore é um banco de dados de documentos NoSQL criado para oferecer escalonamento automático, alto desempenho e facilidade no desenvolvimento de aplicativos. O Firestore é a mais nova versão do Datastore e apresenta várias melhorias em relação a ele.

Como o Firestore no modo Datastore é otimizado para casos de uso do servidor e para o App Engine, recomendamos o uso do Firestore no modo Datastore para bancos de dados que serão usados principalmente por aplicativos do App Engine. O Firestore no modo nativo é mais útil para casos de uso de notificações móveis e em tempo real. Para mais informações sobre os modos do Firestore, consulte Como escolher entre o modo nativo e o modo Datastore.

Neste documento, descrevemos como usar a biblioteca de cliente do Google Cloud para armazenar e recuperar dados em um banco de dados no modo Datastore.

Pré-requisitos e configuração

Siga as instruções em "Hello, World!" para Node.js no App Engine e configure o ambiente e o projeto. Saiba também como os apps Node.js são estruturados no App Engine. Anote e salve o ID do projeto. Você precisará dele para executar o aplicativo de exemplo descrito neste documento.

Clonar o repositório

Faça o download ou clone da amostra:

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

Editar a configuração do projeto e definir as dependências

Em package.json, defina @google-cloud/datastore como uma dependência, que fornece as funções para usar o modo 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"
  }
}

Código do aplicativo

O aplicativo de amostra registra, recupera e exibe IPs de visitantes. A entrada de registro é uma classe simples de dois campos que recebe o tipo visit, sendo salva no modo Datastore por meio do comando save (em inglês) do conjunto de dados. Em seguida, as dez visitas mais recentes são recuperadas em ordem decrescente, por meio do comando runQuery do conjunto de dados.

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

Como usar arquivos index.yaml

O app de exemplo faz consultas simples. Consultas mais elaboradas do modo Datastore exigem um ou mais índices, que você precisa especificar em um arquivo index.yaml enviado com o aplicativo. Esse arquivo pode ser criado ou gerado automaticamente ao testar seu aplicativo localmente.

Teste local

Se precisar desenvolver e testar seu aplicativo localmente, é possível usar o emulador de modo Datastore.

Para saber mais

Para informações completas sobre o modo Datastore, incluindo otimizações e conceitos, veja a documentação do Cloud Firestore no modo Datastore.