まくろぐ

Azure Table Strage を使ってみる (4) Node.js からテーブル操作してみる

更新:
作成:

azure-storage パッケージのインストール

Node.js から Azure Table Storage を操作するには、azure-storage というライブラリを使用します。 npm コマンドで簡単にインストールすることができます。

azure-storage のインストール
$ npm install --save azure-storage

TableService オブジェクトの生成

Azure Storage にアクセスするには、接続情報(ストレージアカウント名とキー)が必要になるので、Azure ポータル で確認しておいてください。

接続情報としてデフォルトの環境変数を使用する

Node.js から Table Storage を扱うには、azure-storage モジュールが提供する TableService クラス を使用します。 TableService のインスタンスは下記のように生成することができます。

const azure = require('azure-storage');

const tableService = new azure.TableService();

上記のように、TableService のコンストラクのパラメータを何も指定しないと、接続のために下記のような環境変数が参照されます。

  1. AZURE_STORAGE_ACCOUNT … Azure Storage の「ストレージアカウント名」
  2. AZURE_STORAGE_ACCESS_KEY … Azure Storage の「キー」
  3. AZURE_STORAGE_CONNECTION_STRING … Azure Storage の「接続文字列」

1 と 2 を両方とも設定するか、3 を設定しておけば Azure Storage にアクセスできるようになります。

接続情報を明示的に指定する

TableService のコンストラクタの引数で、明示的に接続情報を渡すこともできます。

// 接続文字列だけを渡す場合
const tableService = new azure.TableService(connectionString);

// ストレージアカウント名とキーのペアを渡す場合
const tableService = new azure.TableService(storageAccount, storageAccessKey);

複数のストレージアカウントを使い分けたい場合は、独自の環境変数に「接続文字列」を設定しておくとよいでしょう。 ここでは、MAKU_AZURE_STORAGE_CONNECTION_STRING という環境変数に「接続文字列」を設定してみます。

/p/ccoonon/img-env-var.png
const azure = require('azure-storage');

// Azure Storage の接続文字列を環境変数から取得
const connectionString = process.env.MAKU_AZURE_STORAGE_CONNECTION_STRING;
if (typeof connectionString === 'undefined') {
  console.error('MAKU_AZURE_STORAGE_CONNECTION_STRING is not set');
  process.exit(1);
}

// TableService オブジェクトを取得
const tableService = new azure.TableService(connectionString);

プロキシ環境からアクセスする場合

TableService クラスをプロキシ環境内で使用する場合は、OS の https_proxy 環境変数で設定してしまうのが簡単です。 OS の https_proxy 環境変数を設定するのを避けたいときは、TableService クラスの setProxy() メソッドを使ってプロキシを設定することもできます。

プロキシ情報をハードコードする
tableService.setProxy('http://proxy.example.com:12345');

プロキシ情報は環境変数で定義したいけど、OS の https_proxy 環境変数を設定するのは避けたいということであれば、例えば、独自の MAKU_AZURE_PROXY のような 独自の環境変数 を用意するとよいでしょう。

// MAKU_AZURE_PROXY 環境変数が設定されていたらプロキシ情報として使う
if (process.env.MAKU_AZURE_PROXY) {
  tableService.setProxy(process.env.MAKU_AZURE_PROXY);
}

テーブルの操作

ここから先のテーブル操作に関しては、前述の TableService オブジェクトの生成が終わっていることを想定しています。

テーブルを作成する (createTable, createTableIfNotExists)

Table Storage 上に、新しいテーブルを作成するには、TableService クラスの下記のメソッドを使用します。

mytable テーブルを作成する
tableService.createTableIfNotExists('mytable', function(error, result, response) {
  if (error) {
    console.error(error);
    process.exit(1);
  }

  // result contains true if created; false if already exists
  console.log(result);
});
実行結果(テーブルが作成された場合)
{
  isSuccessful: true,
  statusCode: 204,
  TableName: 'mytable',
  created: true
}
実行結果(テーブルが既に存在していた場合)
{
  isSuccessful: true,
  statusCode: 200,
  TableName: 'mytable',
  created: false
}

エンティティの操作

エンティティを取得する (queryEntities)

条件を指定してエンティティのリストを取得するには、TableService クラスの queryEntities() メソッド を使用します。

books テーブルのエンティティをすべて取得
tableService.queryEntities('books', null, null, function (error, result) {
  if (error) {
    console.error(error);
    process.exit(1);
  }

  const entries = result.entries;
  console.log(entries);
});
実行結果
[
  {
    PartitionKey: { '$': 'Edm.String', _: 'book' },
    RowKey: { '$': 'Edm.String', _: '001' },
    Timestamp: { '$': 'Edm.DateTime', _: 2020-01-29T02:28:15.137Z },
    Title: { _: 'まくの秘密' },
    Author: { _: 'まく' },
    '.metadata': { etag: `W/"datetime'2020-01-29T02%3A28%3A15.1370872Z'"` }
  },
  {
    PartitionKey: { '$': 'Edm.String', _: 'book' },
    RowKey: { '$': 'Edm.String', _: '002' },
    Timestamp: { '$': 'Edm.DateTime', _: 2020-01-29T02:29:48.875Z },
    Title: { _: 'へむの秘密' },
    Author: { _: 'へむ' },
    '.metadata': { etag: `W/"datetime'2020-01-29T02%3A29%3A48.8751116Z'"` }
  },
  {
    PartitionKey: { '$': 'Edm.String', _: 'book' },
    RowKey: { '$': 'Edm.String', _: '003' },
    Timestamp: { '$': 'Edm.DateTime', _: 2020-01-29T02:30:28.677Z },
    Title: { _: 'ちいの秘密' },
    Author: { _: 'ちい' },
    '.metadata': { etag: `W/"datetime'2020-01-29T02%3A30%3A28.6771054Z'"` }
  }
]

queryEntities() メソッドの第2パラメータに TableQuery オブジェクト を渡すと、エンティティを検索するための条件を指定することができます。

const query = new azure.TableQuery()
  .top(3)  // 最大 3 件まで取得
  .where('PartitionKey eq ?', 'book')  // PartitionKey が book である
  .and('RowKey >= ?', '2')  // かつ RowKey が 002 以上である
  .select('Title')  // Title プロパティのみを取得

tableService.queryEntities('books', query, null, function (error, result) {
  if (error) {
    console.error(error);
    process.exit(1);
  }

  const entries = result.entries;
  console.log(entries);
});
実行結果
[
  {
    Title: { _: 'へむの秘密' },
    '.metadata': { etag: `W/"datetime'2020-01-29T02%3A29%3A48.8751116Z'"` }
  },
  {
    Title: { _: 'ちいの秘密' },
    '.metadata': { etag: `W/"datetime'2020-01-29T02%3A30%3A28.6771054Z'"` }
  }
]

関連記事

まくろぐ
サイトマップまくへのメッセージ