Contents

在 Node.js 應用程式中使用 AWS DynamoDB

要點

DynamoDB 是 Amazon Web Services (AWS) 提供的非常強大且高效的 NoSQL 資料庫解決方案,它能夠管理大量不同的信息,同時保持最佳水平的效能、彈性和可靠性。

為了在 Node.js 環境中啟動 Amazon NoSQL 資料庫服務(稱為 DynamoDB)的使用,需要從 AWS SDK 取得 client-dynamodb 模組,並建立適當的驗證設定以存取平台。

DynamoDB 提供了一種簡單的方法來建立表,透過寫入、讀取、更新和刪除記錄等各種操作來操作數據,所有這些都使用使用者定義的參數。此功能提高了應用程式設計的適應性和可擴展性,從而提高了整體效率。

將一系列強大的程式語言與強大的資料庫結合使用對於當代應用程式創建的很大一部分至關重要。

Amazon Web Services 提供了一種稱為 DynamoDB 的創新解決方案,該解決方案具有透過快速建立能夠有效處理大量不同資料集的資料庫來改變資料管理的潛力。

什麼是 DynamoDB?

Amazon Web Services 提供了滿足各種資料庫需求的多樣化解決方案,包括針對傳統關聯式資料庫的 Amazon Relational Database Service (RDS) 和支援類似 MongoDB 的文件資料庫的 Amazon DocumentDB。此外,DynamoDB 是使用鍵值儲存系統儲存資料的非關聯式或 NoSQL 資料庫的範例。

DynamoDB 能夠有效管理分散在分散式網路中的大量訊息,同時保持卓越的效能、耐用性和可靠性水準。該系統提供了一個適應性強的框架,可以輕鬆儲存和檢索結構化和非結構化資料。

DynamoDB 是多功能資料庫解決方案,可跨多個網域使用。它可以透過 AWS 管理主控台和 AWS 命令​​列介面 (CLI) 進行訪問,也可以利用 AWS 軟體開發工具包 (SDK) 整合到 Web 應用程式中。

Node.js 中的 DynamoDB 入門

Node.js 提供了多種用於建立後端應用程式介面 (API) 的選項,並為使用者提供了選擇其首選資料庫以在此上下文中整合的靈活性。此外,Node.js 支援眾多外部服務,例如 Amazon Web Services 的 DynamoDB,為開發人員提供了廣泛的選擇來滿足他們的特定要求。

要在 Node 應用程式中使用 Amazon Web Services (AWS) 服務,所需要的只是特定於該特定服務的適當用戶端 SDK 套件。舉個例子,為了與 DynamoDB 交互,必須取得並安裝位於 aws-sdk 中的 client-dynamodb 模組。

若要在指定的專案目錄中執行命令,請依照下列步驟操作:1.使用終端機或命令提示字元導航至所需的項目目錄。2.輸入適當的命令來安裝所需的軟體包,然後按 Enter。3。安裝過程將開始,完成後,您應該透過檢查專案檔案系統中的存在來驗證該套件是否已成功安裝。

 npm install @aws-sdk/client-dynamodb

為了使用 aws-sdk/client-dynamodb 套件在 Node.js 專案中使用 DynamoDB 表,有必要在任何互動之前透過將表格的區域合併到客戶端的配置設定中來指定表格的地理位置。此組態更新應在 DynamoDB 用戶端的初始化過程中執行。

如果您之前已在運算裝置上安裝並使用了 AWS CLI,則您很可能已經在環境設定中建立了 AWS 憑證。在這種情況下,相關的軟體開發工具包 (SDK) 將從所述環境中無縫檢索這些值,而無需您執行任何其他操作。

如果您尚未在 Amazon Web Services (AWS) 控制台中建立 IAM 用戶,則可以透過導覽至 AWS Identity and Access Management (IAM) 服務來建立 IAM 使用者。一旦您建立了這個新的使用者帳戶,您將獲得一個唯一的存取金鑰識別碼和對應的金鑰,作為您存取 AWS 生態系統內各種資源的個人化憑證。

為了將這些身份驗證金鑰合併到您的工作區中,您可以在作業系統上執行以下命令列指令:

在 Unix、Linux 或 macOS 上:

 export AWS_ACCESS_KEY_ID='your access key ID'
export AWS_SECRET_ACCESS_KEY='you secret access key'

在 Windows 上(CMD):

 set AWS_ACCESS_KEY_ID='your access key ID'
set AWS_SECRET_ACCESS_KEY='you secret access key'

在 Windows 上(PowerShell):

 $env:AWS_ACCESS_KEY_ID='your access key ID'
$env:AWS_SECRET_ACCESS_KEY='you secret access key'

在您的 Node.js 專案中,建立一個名為「dynamodb.js」的新檔案。在此檔案中,使用下列程式碼行初始化 Amazon Web Services (AWS) DynamoDB 用戶端的執行個體:

 const { DynamoDB } = require('@aws-sdk/client-dynamodb')

const region = "us-east-1" // your preferred region

const client = new DynamoDB({ region })

AWS 透過防止程式碼本身洩露此類數據,確保敏感安全資訊得到充分保護。因此,當嘗試建立客戶端連線(如前所述)時,將從環境來源檢索必要的存取金鑰和秘密金鑰,而不是直接嵌入程式碼中。

最近建立的客戶端促進了多種功能,例如表格建立和資料輸入/輸出操作。

DynamoDB 在無模式架構上運行,類似於其他 NoSQL 資料庫,它允許向現有表無縫添加新屬性或字段,而不會產生大量開銷。因此,在建立DynamoDB表時,有必要指定將充當主鍵的特定屬性,以促進高效的資料檢索和管理。

事實上,讓我們深入研究一個在 Amazon DynamoDB 服務領域內建立名為「Customer」的新穎表的程式碼範例:

 const createCustomerTable = async () => {
    const params = {
        TableName: "Customer",
        AttributeDefinitions: [
            {
                AttributeName: "Email",
                AttributeType: "S"
            },
        ],
        KeySchema: [
            {
                AttributeName: "Email",
                KeyType: "HASH"
            }
        ],
        ProvisionedThroughput: {
            ReadCapacityUnits: 5,
            WriteCapacityUnits: 5
        }
    };

    client.createTable(params, (err, data) => {
        if (err) {
           console.log(err);
        } else {
            console.log(data);
        }
    });
}

createCustomerTable();

AttributeDefinitions 欄位用於透過定義表的基本屬性及其各自的資料類型來指定表結構的主要特徵。在此特定實例中,電子郵件屬性被指定為具有由縮寫「S」表示的基於字串的資料類型。其他可用的屬性類型包括由“N”表示的數值和由“B”表徵的二進位資料。

為了有效地擷取和排列 DynamoDB 表中的數據,必須建立一個主鍵架構,將一個或多個屬性指定為每個項目的唯一識別碼。在本例中,由於我們已指定「Email」為主鍵,因此應將其包含在指定 KeyType 為「HASH」的 KeySchema 中。這使得 DynamoDB 能夠根據電子郵件地址有效地識別和定位特定記錄。

KeyType 屬性的另一個替代選項是 Range 類型,它在套用於資料庫表中的非唯一雜湊值時充當排序機制。在多個記錄具有相同雜湊值的情況下,利用範圍鍵可以根據附加的區分資訊(例如日期或顏色)對這些記錄進行分組。透過採用這種方法,人們可以以更結構化的方式有效地組織數據,同時避免僅使用雜湊金鑰可能引起的潛在衝突。

上述程式碼中的第三個重要方面與 ProvisionedThroughput 相關,它為指定的 DynamoDB 表建立每秒允許的讀寫操作速率。

執行上述程式碼後,可以預期會獲得以下形式的輸出:

/bc/images/dynamodb_create_table_console.jpg

導覽至 AWS 管理主控台 Web 介面中的 DynamoDB 表儀表板後,我們可以觀察到該表要么正在進行預先配置,要么已成功創建,並且當前顯示「活動」或「已預先配置」狀態。

在確定 ReadCapacityUnits 和 WriteCapacityUnits 的適當值時,仔細評估應用程式的特定要求至關重要,以避免潛在的效能問題或帳戶費用過高。

一旦表被確定為活動的,您就可以執行各種操作,包括建立、讀取、更新和刪除該表中的資料。

提供的範例演示​​了從

⭐ 將資料加入表中。要將資料寫入表,您需要客戶端的 putItem 方法。以下程式碼將新客戶新增至 DynamoDB 中的客戶表。

 const createCustomer = async (customer) => {
    const params = {
        TableName: "Customer",
        Item: customer
    }

    client.putItem(params, (err, data) => {
        if (err) {
           console.error(err)
        } else {
            console.log(data)
        }
    })
}

const customerData = {
    Name: { "S": "Timilehin O." },
    Email: { "S": "[email protected]" },
    Age: { "N": "18"},
    Country: { "S": "Nigeria" }
}

createCustomer(customerData)

params 物件包含 TableName(您要寫入的表)和 Item 欄位(其中包含您要新增的資料及其特定類型)。請注意最初不在表格中的新字段,這就是 DynamoDB 靈活工作的方式。您可以在控制台中查看資料庫中的數據,如下所示:/bc/images/dynamodb_table_data_screen.jpg

⭐ 從表格中讀取資料。 DynamoDB 可讓您以多種方式讀取資料。 SDK的scan函數讀取整個表,而getItem只讀取特定資料。例如,下面的程式碼會取得所有客戶:

 const getAllCustomers = async () => {
    const params = {
        TableName: "Customer"
    }

    const customers = await client.scan(params)
    console.log(customers)
}

而以下程式碼透過電子郵件值取得使用者:

 const getCustomerByEmail = async (email) => {
    const params = {
        TableName: "Customer",
        Key: {
            Email: { "S": email } // the type is always required
        }
    }

    const customer = await client.getItem(params)
    console.log(customer)
}

getCustomerByEmail("[email protected]")

⭐ 更新表中的資料。若要更新表中的現有數據,請使用 SDK 的 updateItem 函數。以下程式碼示範如何更新特定記錄:

  const updateCustomerLocation = async (email, age) => {
     const params = {
         TableName: "Customer",
         Key: {
             Email: { "S": email }
         },
         UpdateExpression: "SET Age = :newAge",
         ExpressionAttributeValues: {
             ':newAge': { "N": age }
         },
         ReturnValues: "ALL_NEW"
     }

     const updatedCustomer = await client.updateItem(params)
     console.log(updatedCustomer.Attributes)
 }

您也可以選擇根據更新資料建立更新表達式來使函數動態化。 DynamoDB 的靈活性可讓您根據需要處理每項操作。

⭐ 從表中刪除資料。若要從 DynamoDB 刪除記錄,您需要 deleteItem 函數和特定記錄的鍵。以下是如何實現它:

 const deleteCustomer = async (email) => {
    const params = {
        TableName: "Customer",
        Key: {
            Email: { "S": email }
        }
    }

    client.deleteItem(params, (err, data) => {
        if (err) {
           console.error(err)
        } else {
            console.log("Customer deleted successfully")
        }
    })
}

deleteCustomer("[email protected]")

使用 DynamoDB 建立高效的應用程式

Amazon Web Services 仍然非常成功,提供了一個用戶友好的平台,用於開發有效、可靠的數位服務,同時確保健全的安全措施到位。對於那些尋求簡化的資料庫體驗、需要對底層基礎設施或保護協定進行最少管理的人來說,DynamoDB 解決方案是一個理想的選擇。

您已經獲得了開始在 Node.js 專案中使用 DynamoDB 所需的知識和工具,使您能夠就其在未來的實施中做出明智的決定。