本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Node.js 的 Amazon QLDB 驅動程序 — 快速入門教程
在本教學中,您將學習如何使用適用於 Node.js 的 Amazon QLDB 驅動程式來設定簡單的應用程式。本指南包含安裝驅動程式的步驟,以及基本建立、讀取、更新和刪除 (CRUD) 操作的簡短 JavaScript 和程式 TypeScript 碼範例。如需在完整範例應用程式中示範這些作業的更深入範例,請參閱Node.js 教學課程.
在適用的情況下,某些步驟會針對每個支援的 Node.js QLDB 驅動程式主要版本提供不同的程式碼範例。
必要條件
在開始之前,請確保您執行以下操作:
如果您正在使用 TypeScript,則還必須執行以下設置步驟。
若要安裝 TypeScript
-
安裝 TypeScript 套件。該QLDB驅動程序在 TypeScript 3.8.x 上運行。
$
npm install --global typescript@3.8.0
-
安裝套件之後,執行下列命令,以確定已安裝 TypeScript 編譯器。
$
tsc --version
若要在下列步驟中執行程式碼,請注意,您必須先將 TypeScript 檔案轉譯為可執行 JavaScript 程式碼,如下所示。
$
tsc app.ts; node app.js
步驟 1:設定您的 專案
首先,設置您的 Node.js 項目。
-
為您的應用程式建立資料夾。
$
mkdir myproject
$
cd myproject
-
若要初始化您的專案,請輸入下列npm
指令並回答設定期間所詢問的問題。您可以對大多數問題使用預設值。
$
npm init
-
安裝 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
-
安裝驅動程序的對等依賴關係。
-
建立一個名app.js
為 JavaScript、或的新檔app.ts
案 TypeScript。
然後,在以下步驟中逐步添加代碼示例以嘗試一些基本CRUD操作。或者,您可以略過 step-by-step 教學課程,而是執行完整的應用程式。
步驟 2:初始化驅動程式
初始化連線至名為之分類帳之驅動程式的執行個體quick-start
。將以下代碼添加到您的app.js
或app.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();
}
- 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 TABLE
和CREATE
INDEX
陳述式。
-
添加以下函數,創建一個名為的表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");
}
-
新增下列函數,為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)");
}
-
在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();
}
-
運行代碼來創建表和索引。
- JavaScript
-
$
node app.js
- TypeScript
-
$
tsc app.ts; node app.js
步驟 4:插入文件
下列程式碼範例會示範如何執行INSERT
陳述式。QLDB支援 P artiQL 查詢語言 (SQL相容) 和 Amazon 離子資料格式 (的JSON超集)。
-
添加以下將文檔插入到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 陳述式中,雙角括號表示稱為袋子的無序集合。
-
在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
陳述式。
-
添加以下功能,從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();
}
-
在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
陳述式。
-
新增下列函數,透過將變更為來更新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");
}
-
在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();
}
-
執行程式碼以插入、查詢和更新文件。
- 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