Azure Cosmos DBをnode.jsから使ってみる

概要

最近Azureを触ることが多いのですが、そのたびに「Cosmos DB押し」をよく聞くのでちょっと触ってみることにしました。無償枠もあるようですので、気軽に試せます。

devblogs.microsoft.com

右も左も分からないので、まずは簡単なチュートリアルに沿って作業を進めます。下記のQiitaの記事を参考にしました。

qiita.com

その後は、作成したItemsコンテナに対してnode.jsアプリからアクセスしてみることにします。以下のドキュメントを参考にしました。

docs.microsoft.com

プロジェクト生成

任意の空ディレクトリにてyarn initを実行してプロジェクトを生成します。その後、yarn add @azure/cosmosを実行して必要なライブラリをインストールします。

設定ファイルの用意

config.jsというファイルを作成して接続先やデータベース名やコンテナ名を記述します。参考にしたドキュメントではプライマリーキーも記していましたが、それはあまり行儀が良くないので今回は環境変数で設定することにします。

const config = {
  endpoint: "エントリーポイント",
  databaseId: "ToDoList",
  containerId: "Items",
}

module.exports = config

環境変数の設定

config.jsにて設定しなかったプライマリーキーを環境変数COSMOSDB_KEYに設定するようにします。単純にLinux/macOSであれば、

export COSMOSDB_KEY=プライマリーキー

を実行するだけです。

プログラムの実装

Cosmos DBに対して参照・追加・更新・削除を行うプログラムapp.jsを実装します。こんな感じの実装となりました。

const CosmosClient = require("@azure/cosmos").CosmosClient
const config = require("./config")

const newItem = {
  id: "3",
  category: "fun",
  name: "Cosmos DB",
  description: "Complete Cosmos DB Node.js Quickstart ⚡",
  isComplete: false
}

async function main() {
  const { endpoint, databaseId, containerId } = config
  let key = null
  try {
    if (process.env.COSMOSDB_KEY) {
      key = process.env.COSMOSDB_KEY
    } else {
      throw new Error('環境変数COSMOSDB_KEYが設定されていません')
    }
  } catch (error) {
    console.log(error.message)
    return
  }

  const client = new CosmosClient({ endpoint, key })

  const database = client.database(databaseId)
  const container = database.container(containerId)

  // SELECTを発行してデータを表示する
  const { resources: items } = await container.items.query('SELECT * FROM c').fetchAll()
  items.forEach(item => {
    console.log(`${item.id} - ${item.description}`)
  })

  // 新しいアイテムを追加する
  const { resource: createdItem } = await container.items.create(newItem)
  console.log(`\r\nCreated new item: ${createdItem.id} - ${createdItem.description}\r\n`)

  // 追加したアイテムに対して更新処理を実施する
  const { id } = createdItem
  createdItem.isComplete = true
  const { resource: updatedItem } = await container.item(id).replace(createdItem)
  console.log(`Updated item: ${updatedItem.id} - ${updatedItem.description}`)
  console.log(`Updated isComplete to ${updatedItem.isComplete}\r\n`)

  // データ削除する
  const { resource: result } = await container.item(id).delete()
  console.log(`Deleted item with id: ${id}`)
}

main()

ポイントは以下のとおりです。

  • async/awaitの使用
  • SELECT文のFROMには何を指定してもいい。
    • サンプルにはcと指定してあり、???だったのですが、何を指定しても良いようです。

あまり分かっていないのでこれからの課題です。

プログラムの実行

最後に実行です。nodeコマンドで作成したapp.jsを実行させます。

$ node app.js
1 - id = 1
2 - This item is second.

Created new item: 3 - Complete Cosmos DB Node.js Quickstart ⚡

Updated item: 3 - Complete Cosmos DB Node.js Quickstart ⚡
Updated isComplete to true

Deleted item with id: 3

SQL API SDKについて

node.jsからアクセスする際のSDKについては以下を参照すれば良さそうです。

docs.microsoft.com

サンプルソース

github.com