目录
要点
- DynamoDB 是 AWS 提供的功能强大的 NoSQL 数据库,可以处理大量不同的数据,而不会影响性能、耐用性或可靠性。
- 要开始在 Node.js 中使用 DynamoDB,您需要从 aws-sdk 安装 client-dynamodb 包并配置您的凭证。
- DynamoDB 允许您使用客户端的方法和参数轻松创建表、写入和读取数据、更新记录以及删除记录。 它为高效的应用程序开发提供了灵活性和可扩展性。
现代应用程序开发的很大一部分需要健壮的编程语言和强大的数据库的结合。
Amazon Web Services (AWS) 提供的解决方案之一是 DynamoDB,这是一种可以彻底改变数据管理的工具。 使用它,您可以快速配置数据库来处理大量不同的数据。
什么是 DynamoDB?
AWS 提供满足不同数据库需求的服务,例如适用于关系数据库的 Amazon RDS 和适用于 MongoDB 等文档数据库的 DocumentDB。 DynamoDB 是一种 NoSQL 数据库,用于以键值格式存储数据。
DynamoDB 可以跨分布式基础设施处理大量数据,而不会影响性能、耐用性或可靠性。 它提供了灵活的模型,使您可以轻松存储和查询数据,无论是结构化数据还是非结构化数据。
您可以使用 DynamoDB 作为各种类型应用程序的数据库。 您可以直接从 AWS Web 控制台并通过 AWS-CLI 以编程方式访问它,或者使用 AWS-SDK 从 Web 应用程序访问它。
Node.js 中的 DynamoDB 入门
有许多用于在 Node.js 中构建后端 API 的工具,在使用这些工具时,您可以自由地为您的 API 选择数据库。 Node.js 为外部服务提供广泛支持,包括 AWS DynamoDB 等数据库。
从 Node 应用程序访问 AWS 服务所需的只是该服务的客户端 aws-sdk 包。 例如,要访问 DynamoDB,您需要在 aws-sdk 下安装 client-dynamodb 软件包。
在项目目录中运行以下命令来安装包:
npm install @aws-sdk/client-dynamodb
在 Node.js 项目中安装 aws-sdk/client-dynamodb 后,您需要将 DynamoDB 表的区域添加到配置中,然后再与其交互。 您将在初始化 DynamoDB 客户端时执行此操作。
如果您之前在计算机上安装并使用过 AWS-CLI,则您可能已经在您的环境中设置了 AWS 凭证,并且开发工具包将自动从环境中获取您的值。
但如果你还没有,你可以前往 AWS 身份访问管理 (IAM) 在控制台中运行服务并创建一个新用户。 创建用户后,您可以获得访问密钥 ID 和密钥,这是您的个人凭据。
通过针对您的平台运行以下终端命令,将这些凭据添加到您的环境中:
在 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。 在此文件中,使用以下代码实例化新的 AWS DynamoDB 客户端:
const { DynamoDB } = require('@aws-sdk/client-dynamodb')const region = "us-east-1"
const client = new DynamoDB({ region })
很简单! AWS 确保您不会在代码中暴露任何安全凭证,因此当上面的代码尝试创建客户端时,它首先从您的环境中读取访问密钥和秘密密钥。
新创建的客户端可以进行建表、读写数据等各种操作。
DynamoDB 与其他 NoSQL 数据库一样是无模式的,因此您始终可以随时向表添加新属性(字段)。 这就是为什么您只需要在创建 DynamoDB 表时添加用作 DynamoDB 表主键的属性。
查看以下代码,该代码在 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 字段是您定义表的关键属性及其类型的位置。 这里的 Email 属性的类型为 S,这意味着该字段需要一个字符串作为其值。 三种可用的属性类型是 S、N 和 B(字符串、数字和二进制)。
您需要 KeySchema 来定义主键,以帮助快速查找和组织项目。 DynamoDB 期望您在创建表时添加的属性为键属性,因此 Email 是此处的主键。 您必须将其添加到 KeySchema 并指定其 KeyType (HASH)。
另一个可用的 KeyType 值是 RANGE,用于排序键。 如果表中可能有具有相同 HASH 键的数据,并且您希望根据一些额外数据(例如日期或颜色)对它们进行分组,则排序键非常有用,您可以将额外数据设为 RANGE 键。
上面代码中的第三个重要参数是ProvisionedThroughput。 您可以在此处定义希望 DynamoDb 每秒允许对表进行读取和写入的次数。
当您运行上面的代码时,您应该得到如下所示的输出:
如果您在 Web 控制台中检查 DynamoDB 表仪表板,您将看到该表仍在配置中或已处于活动状态。
指定 ReadCapacityUnits 和 WriteCapacityUnits 时,请始终考虑您的应用程序需求,因为不合适的值可能会导致性能问题或帐户的高计费成本。
一旦您确定该表已处于活动状态,您就可以对其执行 CRUD 操作。
以下是一些代码示例,向您展示如何从 Customer 表写入和读取数据。
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 灵活工作的方式。 您可以在控制台中查看数据库中的数据,如下所示:
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 }
}
}const customer = await client.getItem(params)
console.log(customer)
}getCustomerByEmail("[email protected]")
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 的灵活性使您可以根据需要处理每项操作。
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 构建高效的应用程序
亚马逊网络服务继续蓬勃发展。 它提供了一个可访问的平台,您可以使用它来提供高效、安全的数字解决方案。 如果您正在寻找一个无需担心基础设施或安全性即可运行的数据库,DynamoDB 是完美的选择。
您现在已具备在 Node.js 中开始使用 DynamoDB 所需的一切,并且可以自信地为您的下一个 Node.js 应用程序选择 DynamoDB。