Como usar o Cloud Datastore

Use o Google Cloud Datastore para armazenar os dados do seu aplicativo do App Engine. O Cloud Datastore é um banco de dados criado para garantir escalonamento automático, alto desempenho e facilidade no desenvolvimento de aplicativos.

Este documento mostra como usar a biblioteca de cliente do Google Cloud (em inglês) para armazenar e recuperar dados usando o Cloud Datastore em um aplicativo do App Engine.

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 aplicativos em Node.js são estruturados no App Engine. Anote e guarde o código do projeto porque você precisará dele para executar o aplicativo de amostra 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

No arquivo package.json, configure @google-cloud/datastore como uma dependência que fornece as funções para usar o Cloud 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": ">=8.0.0"
  },
  "scripts": {
    "start": "node app.js",
    "system-test": "repo-tools test app",
    "test": "npm run system-test"
  },
  "dependencies": {
    "@google-cloud/datastore": "^4.0.0",
    "express": "^4.16.4"
  },
  "devDependencies": {
    "@google-cloud/nodejs-repo-tools": "^3.3.0"
  },
  "cloud-repo-tools": {
    "test": {
      "app": {
        "msg": "Last 10 visits:"
      }
    },
    "requiresKeyFile": true,
    "requiresProjectId": true
  }
}

Código do aplicativo

O aplicativo de exemplo registra, recupera e exibe IPs de visitantes. A entrada de registro é uma classe simples de dois campos que recebe o tipo visit e é salva no Cloud Datastore por meio do comando salvar do conjunto de dados. Em seguida, as 10 visitas mais recentes são recuperadas em ordem decrescente, usando o 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();

/**
 * 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 = process.env.PORT || 8080;
app.listen(process.env.PORT || 8080, () => {
  console.log(`App listening on port ${PORT}`);
  console.log('Press Ctrl+C to quit.');
});

Como usar arquivos index.yaml

O aplicativo de amostra faz consultas simples. Em consultas mais elaboradas do Datastore, é necessário especificar um ou mais índices em um arquivo index.yaml. O upload desse arquivo é feito com o aplicativo. É possível criá-lo manualmente ou gerá-lo automaticamente ao testar o aplicativo no local.

Teste local

Se for preciso desenvolver e testar o aplicativo localmente, use o emulador do Cloud Datastore.

Para saber mais

Consulte a documentação do Cloud Datastore para informações completas sobre ele, incluindo otimizações e conceitos.