Node.js 用の Amazon QLDB ドライバー — クイックスタートチュートリアル - Amazon Quantum Ledger Database (Amazon QLDB)

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Node.js 用の Amazon QLDB ドライバー — クイックスタートチュートリアル

このチュートリアルでは、Node.js 用の Amazon QLDB ドライバーを使用して簡単なアプリケーションを設定する方法について説明します。このガイドには、ドライバをインストールする手順が含まれています。JavaScriptそしてTypeScriptBasic のコード例作成、読み取り、更新、削除(CRUD) オペレーション。これらのオペレーションを完全なサンプルアプリケーションで実行する詳細な例については、「Node.js チュートリアル」を参照してください。

注記

該当する場合、Node.js の QLDB ドライバのサポートされているメジャーバージョンごとに異なるコード例がある手順もあります。

前提条件

作業を始める前に、次の操作を実行してください。

  1. Node.js ドライバー用の「前提条件」を完了します (まだ完了していない場合)。これには、AWS へのサインアップ、開発用の AWS アクセスキーの取得、Node.js のインストールが含まれます。

  2. quick-start という名前の台帳を作成します。

    レジャーを作成する方法については、「」を参照してください。Amazon QLDB 台帳の基本的なオペレーションまたはステップ 1: 新しい台帳を作成するコンソールの開始方法

使用しているTypeScriptでは、次のセットアップ手順も実行する必要があります。

TypeScript をインストールするには

  1. TypeScript パッケージをインストールします。QLDB ドライバは上で動作しますTypeScript3.5.x。

    $ npm install --global typescript@3.5.1
  2. パッケージがインストールされたら、次のコマンドを実行して、TypeScriptコンパイラがインストールされている。

    $ tsc --version

次の手順でコードを実行するには、まずTypeScriptファイルを実行可能ファイルにJavaScript次のようになります。

$ tsc app.ts; node app.js

ステップ 1: プロジェクトを設定する

まず、Node.js プロジェクトを設定します。

  1. アプリケーション用のフォルダを作成します。

    $ mkdir myproject $ cd myproject
  2. プロジェクトを初期化するには、次の npm コマンドを入力し、設定中に表示される質問に回答します。ほとんどの質問にはデフォルトを使用できます。

    $ npm init
  3. Node.js 用Amazon QLDB ドライバーをインストールします。

    • バージョン 2.x を使用する

      $ npm install amazon-qldb-driver-nodejs --save
    • バージョン 1.x を使用する

      $ npm install amazon-qldb-driver-nodejs@1.0.0 --save
  4. ドライバーのピア依存関係をインストールします。

    $ npm install aws-sdk --save $ npm install ion-js@4.0.0 --save $ npm install jsbi@3.1.2 --save
  5. という名前の新しいファイルを作成します。app.jsにとってJavaScript, またはapp.tsにとってTypeScript。

    次に、次の手順でコード例を段階的に追加し、いくつかの基本的な CRUD オペレーションを試します。または、スキップすることもできます。step-by-stepチュートリアルを実行し、代わりに完全なアプリケーション

ステップ 2: ドライバーを初期化する

quick-start という名前の台帳に接続するドライバーのインスタンスを初期化します。次のコードをに追加します。app.jsまたはapp.tsファイルを開きます。

バージョン 2.x を使用する

JavaScript
var qldb = require('amazon-qldb-driver-nodejs'); var https = require('https'); function main() { var maxConcurrentTransactions = 10; var retryLimit = 4; var agentForQldb = new https.Agent({ keepAlive: true, maxSockets: maxConcurrentTransactions }); var serviceConfigurationOptions = { region: "us-east-1", httpOptions: { agent: agentForQldb } }; // Use driver's default backoff function for this example (no second parameter provided to RetryConfig) var retryConfig = new qldb.RetryConfig(retryLimit); var driver = new qldb.QldbDriver("quick-start", serviceConfigurationOptions, maxConcurrentTransactions, retryConfig); } main();
TypeScript
import { QldbDriver, RetryConfig } from "amazon-qldb-driver-nodejs"; import { ClientConfiguration } from "aws-sdk/clients/acm"; import { Agent } from "https"; function main(): void { const maxConcurrentTransactions: number = 10; const agentForQldb: Agent = new Agent({ keepAlive: true, maxSockets: maxConcurrentTransactions }); const serviceConfigurationOptions: ClientConfiguration = { region: "us-east-1", httpOptions: { agent: agentForQldb } }; const retryLimit: number = 4; // Use driver's default backoff function for this example (no second parameter provided to RetryConfig) const retryConfig: RetryConfig = new RetryConfig(retryLimit); const driver: QldbDriver = new QldbDriver("quick-start", serviceConfigurationOptions, maxConcurrentTransactions, retryConfig); } if (require.main === module) { main(); }
注記
  • このコード例では、us-east-1とAWS元帳を作成したリージョン。

  • バージョン 2.x では、新しいオプションパラメータが導入されました。RetryConfig初期化用QldbDriver

  • 簡単にするために、このガイドの残りのコード例では、次のバージョン 1.x の例で指定されているデフォルト設定のドライバを使用しています。独自のドライバーインスタンスをカスタムで使用することもできます。RetryConfig代わりに。

  • このコード例では、Keep-Alive オプションを設定して、既存の接続を再利用するドライバを初期化します。詳細については、次を参照してください。セットアップの推奨事項は Node.js ドライバー用です。

バージョン 1.x を使用する

JavaScript
const qldb = require('amazon-qldb-driver-nodejs'); function main() { // Use default settings const driver = new qldb.QldbDriver("quick-start"); } main();
TypeScript
import { QldbDriver } from "amazon-qldb-driver-nodejs"; function main(): void { // Use default settings const driver: QldbDriver = new QldbDriver("quick-start"); } if (require.main === module) { main(); }
注記

次のようになります。AWS_REGIONリージョンを指定する環境変数。詳細については、「」を参照してください。設定するAWSリージョンAWS SDK for JavaScriptデベロッパーガイド

ステップ 3: テーブルとインデックスを作成する

次のコード例は、CREATE TABLE ステートメントと CREATE INDEX ステートメントの実行方法を示しています。

  1. 次の関数を追加して People という名前のテーブルを作成します。

    JavaScript
    async function createTable(txn) { await txn.execute("CREATE TABLE People"); }
    TypeScript
    async function createTable(txn: TransactionExecutor): Promise<void> { await txn.execute("CREATE TABLE People"); }
  2. People テーブルの firstName フィールドのインデックスを作成する、以下の関数を追加します。インデックスクエリのパフォーマンスを最適化し、制限するために役立つことが必要ですオプティミスティック同時実行制御 (OCC)競合例外。

    JavaScript
    async function createIndex(txn) { await txn.execute("CREATE INDEX ON People (firstName)"); }
    TypeScript
    async function createIndex(txn: TransactionExecutor): Promise<void> { await txn.execute("CREATE INDEX ON People (firstName)"); }
  3. main関数では、最初に呼び出すcreateTableと呼び出しcreateIndex

    JavaScript
    const qldb = require('amazon-qldb-driver-nodejs'); async function main() { // Use default settings const driver = new qldb.QldbDriver("quick-start"); await driver.executeLambda(async (txn) => { console.log("Create table People"); await createTable(txn); console.log("Create index on firstName"); await createIndex(txn); }); driver.close(); } main();
    TypeScript
    import { QldbDriver, TransactionExecutor } from "amazon-qldb-driver-nodejs"; async function main(): Promise<void> { // Use default settings const driver: QldbDriver = new QldbDriver("quick-start"); await driver.executeLambda(async (txn: TransactionExecutor) => { console.log("Create table People"); await createTable(txn); console.log("Create index on firstName"); await createIndex(txn); }); driver.close(); } if (require.main === module) { main(); }
  4. コードを実行して、テーブルとインデックスを作成します。

    JavaScript
    $ node app.js
    TypeScript
    $ tsc app.ts; node app.js

ステップ 4: ドキュメントを挿入する

次のコード例は、INSERT ステートメントの実行方法を示しています。QLDB は、PartiQLクエリ言語 (SQL 互換) とAmazon Ionデータ形式 (JSON のスーパーセット)。

  1. 次の関数を追加して People テーブルにドキュメントを挿入します。

    JavaScript
    async function insertDocument(txn) { const person = { firstName: "John", lastName: "Doe", age: 42 }; await txn.execute("INSERT INTO People ?", person); }
    TypeScript
    async function insertDocument(txn: TransactionExecutor): Promise<void> { const person: Record<string, any> = { firstName: "John", lastName: "Doe", age: 42 }; await txn.execute("INSERT INTO People ?", person); }

    この例では、疑問符 (?) を変数プレースホルダーとして使用して、ドキュメント情報をステートメントに渡します。-executeメソッドは、Amazon Ion タイプと Node.js ネイティブ型の両方の値をサポートします。

    ヒント

    1 つのドキュメントを使用して複数のドキュメントを挿入するにはINSERTステートメント、型のパラメータを渡すことができますリストを次のように述べる。

    // people is a list txn.execute("INSERT INTO People ?", people);

    変数プレースホルダは囲まない (?) を二重山かっこ (<<...>>) リストを渡すとき。手動の PartiQL ステートメントでは、二重山括弧は順序付けられていないコレクションを表します。バッグ

  2. main関数、削除するcreateTableそしてcreateIndexを呼び出し、コールをに追加するinsertDocument

    JavaScript
    const qldb = require('amazon-qldb-driver-nodejs'); async function main() { // Use default settings const driver = new qldb.QldbDriver("quick-start"); await driver.executeLambda(async (txn) => { console.log("Insert document"); await insertDocument(txn); }); driver.close(); } main();
    TypeScript
    import { QldbDriver, TransactionExecutor } from "amazon-qldb-driver-nodejs"; async function main(): Promise<void> { // Use default settings const driver: QldbDriver = new QldbDriver("quick-start"); await driver.executeLambda(async (txn: TransactionExecutor) => { console.log("Insert document"); await insertDocument(txn); }); driver.close(); } if (require.main === module) { main(); }

ステップ 5: ドキュメントにクエリを実行する

次のコード例は、SELECT ステートメントの実行方法を示しています。

  1. 次の関数を追加して People テーブルのドキュメントにクエリを実行します。

    JavaScript
    async function fetchDocuments(txn) { return await txn.execute("SELECT firstName, age, lastName FROM People WHERE firstName = ?", "John"); }
    TypeScript
    async function fetchDocuments(txn: TransactionExecutor): Promise<dom.Value[]> { return (await txn.execute("SELECT firstName, age, lastName FROM People WHERE firstName = ?", "John")).getResultList(); }
  2. main関数で、次の呼び出しをに追加します。fetchDocumentsへの呼び出しの後insertDocument

    JavaScript
    const qldb = require('amazon-qldb-driver-nodejs'); async function main() { // Use default settings const driver = new qldb.QldbDriver("quick-start"); var resultList = await driver.executeLambda(async (txn) => { console.log("Insert document"); await insertDocument(txn); console.log("Fetch document"); var result = await fetchDocuments(txn); return result.getResultList(); }); // Pretty print the result list console.log("The result List is ", JSON.stringify(resultList, null, 2)); driver.close(); } main();
    TypeScript
    import { QldbDriver, TransactionExecutor } from "amazon-qldb-driver-nodejs"; import { dom } from "ion-js"; async function main(): Promise<void> { // Use default settings const driver: QldbDriver = new QldbDriver("quick-start"); const resultList: dom.Value[] = await driver.executeLambda(async (txn: TransactionExecutor) => { console.log("Insert document"); await insertDocument(txn); console.log("Fetch document"); return await fetchDocuments(txn); }); // Pretty print the result list console.log("The result List is ", JSON.stringify(resultList, null, 2)); driver.close(); } if (require.main === module) { main(); }

ステップ 6: ドキュメントを更新する

次のコード例は、UPDATE ステートメントの実行方法を示しています。

  1. 次の関数を追加し、lastName"Stiles" に変更して People テーブルのドキュメントを更新します。

    JavaScript
    async function updateDocuments(txn) { await txn.execute("UPDATE People SET lastName = ? WHERE firstName = ?", "Stiles", "John"); }
    TypeScript
    async function updateDocuments(txn: TransactionExecutor): Promise<void> { await txn.execute("UPDATE People SET lastName = ? WHERE firstName = ?", "Stiles", "John"); }
  2. main関数で、次の呼び出しをに追加します。updateDocumentsへの呼び出しの後fetchDocuments。次に、を呼び出すfetchDocumentsを再度表示して、更新された結果を確認します。

    JavaScript
    const qldb = require('amazon-qldb-driver-nodejs'); async function main() { // Use default settings const driver = new qldb.QldbDriver("quick-start"); var resultList = await driver.executeLambda(async (txn) => { console.log("Insert document"); await insertDocument(txn); console.log("Fetch document"); await fetchDocuments(txn); console.log("Update document"); await updateDocuments(txn); console.log("Fetch document after update"); var result = await fetchDocuments(txn); return result.getResultList(); }); // Pretty print the result list console.log("The result List is ", JSON.stringify(resultList, null, 2)); driver.close(); } main();
    TypeScript
    import { QldbDriver, TransactionExecutor } from "amazon-qldb-driver-nodejs"; import { dom } from "ion-js"; async function main(): Promise<void> { // Use default settings const driver: QldbDriver = new QldbDriver("quick-start"); const resultList: dom.Value[] = await driver.executeLambda(async (txn: TransactionExecutor) => { console.log("Insert document"); await insertDocument(txn); console.log("Fetch document"); await fetchDocuments(txn); console.log("Update document"); await updateDocuments(txn); console.log("Fetch document after update"); return await fetchDocuments(txn); }); // Pretty print the result list console.log("The result List is ", JSON.stringify(resultList, null, 2)); driver.close(); } if (require.main === module) { main(); }
  3. コードを実行して、ドキュメントを挿入、クエリ、および更新します。

    JavaScript
    $ node app.js
    TypeScript
    $ tsc app.ts; node app.js

完全なアプリケーションの実行

次のコード例は、の完全なバージョンです。app.jsそしてapp.ts。上のステップを個別に実行する代わりに、このコードを最初から最後まで実行することもできます。このアプリケーションは、quick-start という名前の台帳に対するいくつかの基本的な CRUD オペレーションを実行します。

注記

このコードを実行する前に、quick-start 台帳に People という名前のアクティブなテーブルが存在しないことを確認してください。

JavaScript
const qldb = require('amazon-qldb-driver-nodejs'); async function createTable(txn) { await txn.execute("CREATE TABLE People"); } async function createIndex(txn) { await txn.execute("CREATE INDEX ON People (firstName)"); } async function insertDocument(txn) { const person = { firstName: "John", lastName: "Doe", age: 42 }; await txn.execute("INSERT INTO People ?", person); } async function fetchDocuments(txn) { return await txn.execute("SELECT firstName, age, lastName FROM People WHERE firstName = ?", "John"); } async function updateDocuments(txn) { await txn.execute("UPDATE People SET lastName = ? WHERE firstName = ?", "Stiles", "John"); } async function main() { // Use default settings const driver = new qldb.QldbDriver("quick-start"); var resultList = await driver.executeLambda(async (txn) => { console.log("Create table People"); await createTable(txn); console.log("Create index on firstName"); await createIndex(txn); console.log("Insert document"); await insertDocument(txn); console.log("Fetch document"); await fetchDocuments(txn); console.log("Update document"); await updateDocuments(txn); console.log("Fetch document after update"); var result = await fetchDocuments(txn); return result.getResultList(); }); // Pretty print the result list console.log("The result List is ", JSON.stringify(resultList, null, 2)); driver.close(); } main();
TypeScript
import { QldbDriver, TransactionExecutor } from "amazon-qldb-driver-nodejs"; import { dom } from "ion-js"; async function createTable(txn: TransactionExecutor): Promise<void> { await txn.execute("CREATE TABLE People"); } async function createIndex(txn: TransactionExecutor): Promise<void> { await txn.execute("CREATE INDEX ON People (firstName)"); } async function insertDocument(txn: TransactionExecutor): Promise<void> { const person: Record<string, any> = { firstName: "John", lastName: "Doe", age: 42 }; await txn.execute("INSERT INTO People ?", person); } async function fetchDocuments(txn: TransactionExecutor): Promise<dom.Value[]> { return (await txn.execute("SELECT firstName, age, lastName FROM People WHERE firstName = ?", "John")).getResultList(); } async function updateDocuments(txn: TransactionExecutor): Promise<void> { await txn.execute("UPDATE People SET lastName = ? WHERE firstName = ?", "Stiles", "John"); }; async function main(): Promise<void> { // Use default settings const driver: QldbDriver = new QldbDriver("quick-start"); const resultList: dom.Value[] = await driver.executeLambda(async (txn: TransactionExecutor) => { console.log("Create table People"); await createTable(txn); console.log("Create index on firstName"); await createIndex(txn); console.log("Insert document"); await insertDocument(txn); console.log("Fetch document"); await fetchDocuments(txn); console.log("Update document"); await updateDocuments(txn); console.log("Fetch document after update"); return await fetchDocuments(txn); }); // Pretty print the result list console.log("The result List is ", JSON.stringify(resultList, null, 2)); driver.close(); } if (require.main === module) { main(); }

完全なアプリケーションを実行するには、次のコマンドを入力します。

JavaScript
$ node app.js
TypeScript
$ tsc app.ts; node app.js