Node.js 的 Amazon QLDB 驅動程序 — 快速入門教程 - Amazon Quantum 賬本數據庫(AmazonQLDB)

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Node.js 的 Amazon QLDB 驅動程序 — 快速入門教程

重要

支援結束通知:現有客戶將能夠使用 Amazon,QLDB直到 2025 年 7 月 31 日終止支援為止。有關更多詳細信息,請參閱將 Amazon QLDB 分類帳遷移到 Amazon Aurora 郵政. SQL

在本教學中,您將學習如何使用適用於 Node.js 的 Amazon QLDB 驅動程式來設定簡單的應用程式。本指南包含安裝驅動程式的步驟,以及基本建立、讀取、更新和刪除 (CRUD) 操作的簡短 JavaScript 和程式 TypeScript 碼範例。如需在完整範例應用程式中示範這些作業的更深入範例,請參閱Node.js 教學課程.

注意

在適用的情況下,某些步驟會針對每個支援的 Node.js QLDB 驅動程式主要版本提供不同的程式碼範例。

必要條件

在開始之前,請確保您執行以下操作:

  1. 如果您尚未完成 Node.js 驅動程式,請完成此操作。必要條件這包括註冊 AWS、授予程式設計存取以供開發,以及安裝 Node.js。

  2. 建立名為的分類帳quick-start

    若要瞭解如何建立分類帳,請參閱Amazon QLDB 分類帳的基本操作步驟 1:建立新分類帳在「開始使用主控台」中的。

如果您正在使用 TypeScript,則還必須執行以下設置步驟。

若要安裝 TypeScript
  1. 安裝 TypeScript 套件。該QLDB驅動程序在 TypeScript 3.8.x 上運行。

    $ npm install --global typescript@3.8.0
  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 驅動程序。

    • 使用版本 3.x

      $ npm install amazon-qldb-driver-nodejs --save
    • 使用版本 2.x

      $ npm install amazon-qldb-driver-nodejs@2.2.0 --save
    • 使用版本 1.x

      $ npm install amazon-qldb-driver-nodejs@1.0.0 --save
  4. 安裝驅動程序的對等依賴關係。

    • 使用版本 3.x

      $ npm install @aws-sdk/client-qldb-session --save $ npm install ion-js --save $ npm install jsbi --save
    • 使用版本 2.x 或 1.x 版

      $ npm install aws-sdk --save $ npm install ion-js@4.0.0 --save $ npm install jsbi@3.1.1 --save
  5. 建立一個名app.js為 JavaScript、或的新檔app.ts案 TypeScript。

    然後,在以下步驟中逐步添加代碼示例以嘗試一些基本CRUD操作。或者,您可以略過 step-by-step 教學課程,而是執行完整的應用程式

步驟 2:初始化驅動程式

初始化連線至名為之分類帳之驅動程式的執行個體quick-start。將以下代碼添加到您的app.jsapp.ts文件中。

JavaScript
var qldb = require('amazon-qldb-driver-nodejs'); var https = require('https'); function main() { const maxConcurrentTransactions = 10; const retryLimit = 4; const agentForQldb = new https.Agent({ maxSockets: maxConcurrentTransactions }); const lowLevelClientHttpOptions = { httpAgent: agentForQldb } const serviceConfigurationOptions = { region: "us-east-1" }; // 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, lowlevelClientHttpOptions, maxConcurrentTransactions, retryConfig); } main();
TypeScript
import { Agent } from "https"; import { NodeHttpHandlerOptions } from "@aws-sdk/node-http-handler"; import { QLDBSessionClientConfig } from "@aws-sdk/client-qldb-session"; import { QldbDriver, RetryConfig } from "amazon-qldb-driver-nodejs"; function main(): void { const maxConcurrentTransactions: number = 10; const agentForQldb: Agent = new Agent({ maxSockets: maxConcurrentTransactions }); const lowLevelClientHttpOptions: NodeHttpHandlerOptions = { httpAgent: agentForQldb }; const serviceConfigurationOptions: QLDBSessionClientConfig = { region: "us-east-1" }; 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, lowLevelClientHttpOptions, maxConcurrentTransactions, retryConfig); } if (require.main === module) { main(); }
注意
  • 在此代碼示例中,替換 us-east-1 與您創建分類帳的 AWS 區域 位置。

  • 為了簡化起見,本指南中其餘的程式碼範例會使用具有預設設定的驅動程式,如下列 1.x 版範例中所指定的驅動程式。您也可以使用自己的驅動程序實例,RetryConfig而不是自定義。

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 驅動程式的相關資訊。

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 SDK for JavaScript 開發人員指南 AWS 區域中的設定

第 3 步:創建一個表和索引

下列程式碼範例會示範如何執行CREATE TABLECREATE 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支援 P artiQL 查詢語言 (SQL相容) 和 Amazon 離子資料格式 (的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 離子類型和 Node.js 原生類型中的值。

    提示

    要通過使用單個INSERT語句插入多個文檔,你可以通過類型列表的參數到語句如下。

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

    傳遞清單時,您不會將變數預留位置 (?) 括在雙尖括號 (<<...>>) 中。在手動 PartiQL 陳述式中,雙角括號表示稱為袋子的無序集合。

  2. main函數中,移除createTablecreateIndex呼叫,然後將呼叫新增至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. 新增下列函數,透過將變更為來更新People表格中的文lastName"Stiles"

    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。您也可以從頭到尾運行此代碼,而不是單獨執行前面的步驟。此應用程序演示了名為的分類帳上的一些基本CRUD操作quick-start

注意

在執行此程式碼之前,請確定您尚未在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