Exemple : Application "Hello World" pour Node.js

Cet exemple de code est une application "Hello World" qui s'exécute sur Node.js. Il montre comment effectuer les tâches suivantes :

  • se connecter à une instance Cloud Bigtable ;
  • créer une table ;
  • écrire des données dans la table ;
  • relire les données ;
  • supprimer la table.

Exécuter l'exemple

Cet exemple de code communique avec Cloud Bigtable à l'aide du package Cloud Bigtable de la bibliothèque cliente Google Cloud pour Node.js.

Pour exécuter cet exemple de programme, suivez les instructions correspondantes sur GitHub.

Utiliser la bibliothèque cliente Cloud avec Cloud Bigtable

L'exemple d'application permet de se connecter à Cloud Bigtable et décrit quelques opérations simples.

Bibliothèque cliente requise

L'exemple nécessite le module @google-cloud/bigtable, qui fournit la classe Bigtable.

const {Bigtable} = require('@google-cloud/bigtable');

Se connecter à Cloud Bigtable

Pour vous connecter à Cloud Bigtable, créez un objet Bigtable. Appelez ensuite sa méthode instance() pour obtenir un objet Instance qui représente votre instance Cloud Bigtable.

const bigtableClient = new Bigtable();
const instance = bigtableClient.instance(INSTANCE_ID);

Créer une table

Appelez la méthode table() de l'instance pour obtenir un objet Table qui représente la table pour les messages d'accueil de l'application "Hello World". Si la table n'existe pas, appelez sa méthode create() pour créer une table avec une seule famille de colonnes qui conserve une version de chaque valeur.

const table = instance.table(TABLE_ID);
const [tableExists] = await table.exists();
if (!tableExists) {
  console.log(`Creating table ${TABLE_ID}`);
  const options = {
    families: [
      {
        name: COLUMN_FAMILY_ID,
        rule: {
          versions: 1,
        },
      },
    ],
  };
  await table.create(options);
}

Écrire des lignes dans une table

Créez des lignes pour la table à l'aide d'un tableau de chaînes de salutations : appelez la méthode map() du tableau pour créer un tableau d'objets représentant les lignes, puis appelez la méthode insert() de la table pour ajouter les lignes à cette dernière.

console.log('Write some greetings to the table');
const greetings = ['Hello World!', 'Hello Bigtable!', 'Hello Node!'];
const rowsToInsert = greetings.map((greeting, index) => ({
  // Note: This example uses sequential numeric IDs for simplicity, but this
  // pattern can result in poor performance in a production application.
  // Rows are stored in sorted order by key, so sequential keys can result
  // in poor distribution of operations across nodes.
  //
  // For more information about how to design an effective schema for Cloud
  // Bigtable, see the documentation:
  // https://cloud.google.com/bigtable/docs/schema-design
  key: `greeting${index}`,
  data: {
    [COLUMN_FAMILY_ID]: {
      [COLUMN_QUALIFIER]: {
        // Setting the timestamp allows the client to perform retries. If
        // server-side time is used, retries may cause multiple cells to
        // be generated.
        timestamp: new Date(),
        value: greeting,
      },
    },
  },
}));
await table.insert(rowsToInsert);

Créer un filtre

Avant de lire les données que vous avez écrites, créez un filtre pour limiter les données renvoyées par Cloud Bigtable. Ce filtre indique à Cloud Bigtable de ne renvoyer que la version la plus récente de chaque valeur, même si la table contient des versions antérieures qui n'ont pas fait l'objet d'une récupération de mémoire.

const filter = [
  {
    column: {
      cellLimit: 1, // Only retrieve the most recent version of the cell.
    },
  },
];

Lire une ligne à l'aide de sa clé

Appelez la méthode row() de la table pour obtenir une référence à la ligne avec une clé de ligne spécifique. Appelez ensuite la méthode get() sur la ligne en appliquant le filtre pour obtenir une version de chaque valeur figurant dans cette ligne.

console.log('Reading a single row by row key');
const [singleRow] = await table.row('greeting0').get({filter});
console.log(`\tRead: ${getRowGreeting(singleRow)}`);

Analyser toutes les lignes de la table

Appelez la méthode getRows() de la table en appliquant le filtre pour obtenir toutes les lignes de la table. En raison du filtre, Cloud Bigtable ne renvoie qu'une version de chaque valeur.

console.log('Reading the entire table');
// Note: For improved performance in production applications, call
// `Table#readStream` to get a stream of rows. See the API documentation:
// https://cloud.google.com/nodejs/docs/reference/bigtable/latest/Table#createReadStream
const [allRows] = await table.getRows({filter});
for (const row of allRows) {
  console.log(`\tRead: ${getRowGreeting(row)}`);
}

Supprimer une table

Supprimez la table à l'aide de sa méthode delete().

console.log('Delete the table');
await table.delete();

Synthèse

Voici l'exemple de code complet sans commentaires.



const {Bigtable} = require('@google-cloud/bigtable');

const TABLE_ID = 'Hello-Bigtable';
const COLUMN_FAMILY_ID = 'cf1';
const COLUMN_QUALIFIER = 'greeting';
const INSTANCE_ID = process.env.INSTANCE_ID;

if (!INSTANCE_ID) {
  throw new Error('Environment variables for INSTANCE_ID must be set!');
}

const getRowGreeting = row => {
  return row.data[COLUMN_FAMILY_ID][COLUMN_QUALIFIER][0].value;
};

(async () => {
  try {
    const bigtableClient = new Bigtable();
    const instance = bigtableClient.instance(INSTANCE_ID);

    const table = instance.table(TABLE_ID);
    const [tableExists] = await table.exists();
    if (!tableExists) {
      console.log(`Creating table ${TABLE_ID}`);
      const options = {
        families: [
          {
            name: COLUMN_FAMILY_ID,
            rule: {
              versions: 1,
            },
          },
        ],
      };
      await table.create(options);
    }

    console.log('Write some greetings to the table');
    const greetings = ['Hello World!', 'Hello Bigtable!', 'Hello Node!'];
    const rowsToInsert = greetings.map((greeting, index) => ({
      key: `greeting${index}`,
      data: {
        [COLUMN_FAMILY_ID]: {
          [COLUMN_QUALIFIER]: {
            timestamp: new Date(),
            value: greeting,
          },
        },
      },
    }));
    await table.insert(rowsToInsert);

    const filter = [
      {
        column: {
          cellLimit: 1, // Only retrieve the most recent version of the cell.
        },
      },
    ];

    console.log('Reading a single row by row key');
    const [singleRow] = await table.row('greeting0').get({filter});
    console.log(`\tRead: ${getRowGreeting(singleRow)}`);

    console.log('Reading the entire table');
    const [allRows] = await table.getRows({filter});
    for (const row of allRows) {
      console.log(`\tRead: ${getRowGreeting(row)}`);
    }

    console.log('Delete the table');
    await table.delete();
  } catch (error) {
    console.error('Something went wrong:', error);
  }
})();