Node.js hello world

Contoh kode ini adalah aplikasi "halo dunia" yang berjalan di Node.js. Contoh ini menunjukkan cara menyelesaikan tugas-tugas berikut:

  • Menyiapkan autentikasi
  • Menghubungkan ke instance Bigtable.
  • Buat tabel baru.
  • Tulis data ke tabel.
  • Baca kembali data.
  • Hapus tabel.

Menyiapkan autentikasi

Untuk menggunakan contoh Node.js di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

  1. Install the Google Cloud CLI.
  2. To initialize the gcloud CLI, run the following command:

    gcloud init
  3. If you're using a local shell, then create local authentication credentials for your user account:

    gcloud auth application-default login

    You don't need to do this if you're using Cloud Shell.

Untuk informasi selengkapnya, lihat Set up authentication for a local development environment.

Menjalankan contoh

Contoh kode ini menggunakan paket Bigtable dari Library Klien Google Cloud untuk Node.js untuk berkomunikasi dengan Bigtable.

Untuk menjalankan program contoh ini, ikuti petunjuk untuk contoh di GitHub.

Menggunakan Library Klien Cloud dengan Bigtable

Aplikasi contoh terhubung ke Bigtable dan menunjukkan beberapa operasi sederhana.

Mewajibkan library klien

Contoh ini memerlukan modul @google-cloud/bigtable, yang menyediakan class Bigtable.

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

Menghubungkan ke Bigtable

Untuk terhubung ke Bigtable, buat objek Bigtable baru. Kemudian, panggil metode instance() untuk mendapatkan objek Instance yang mewakili instance Bigtable Anda.

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

Membuat tabel

Panggil metode table() instance untuk mendapatkan objek Table yang mewakili tabel untuk sapaan "halo dunia". Jika tabel tidak ada, panggil metode create() tabel untuk membuat tabel dengan satu grup kolom yang mempertahankan satu versi dari setiap nilai.

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

Menulis baris ke tabel

Gunakan array string ucapan untuk membuat beberapa baris baru untuk tabel: panggil metode map() array untuk membuat array objek baru yang mewakili baris, lalu panggil metode insert() tabel untuk menambahkan baris ke tabel.

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);

Membuat filter

Sebelum membaca data yang Anda tulis, buat filter untuk membatasi data yang ditampilkan Bigtable. Filter ini memberi tahu Bigtable untuk hanya menampilkan sel terbaru untuk setiap kolom, meskipun kolom berisi sel yang lebih lama.

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

Membaca baris berdasarkan kunci barisnya

Panggil metode row() tabel untuk mendapatkan referensi ke baris dengan kunci baris tertentu. Kemudian, panggil metode get() baris, dengan meneruskan filter, untuk mendapatkan satu versi setiap nilai dalam baris tersebut.

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

Memindai semua baris tabel

Panggil metode getRows() tabel, dengan meneruskan filter, untuk mendapatkan semua baris dalam tabel. Karena Anda meneruskan filter, Bigtable hanya menampilkan satu versi dari setiap nilai.

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)}`);
}

Menghapus tabel

Hapus tabel dengan metode delete() tabel.

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

Menggabungkan semuanya

Berikut adalah contoh kode lengkap tanpa komentar.




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);
  }
})();