在当前页面
使用 DynamoDB 的 API 服务器
在本教程中,我们将学习如何使用它来构建一个小型 API,该 API 具有插入和检索信息的端点,并由 DynamoDB 提供支持。
本教程假设您拥有 AWS 和 Deno Deploy 账户。
概述 Jump to heading
我们将构建一个具有单个端点的 API,该端点接受 GET/POST 请求并返回相应的信息。
# 对端点的 GET 请求应根据歌曲标题返回歌曲的详细信息。
GET /songs?title=Song%20Title # '%20' == 空格
# 响应
{
title: "Song Title"
artist: "Someone"
album: "Something",
released: "1970",
genres: "country rap",
}
# 对端点的 POST 请求应插入歌曲详细信息。
POST /songs
# POST 请求体
{
title: "A New Title"
artist: "Someone New"
album: "Something New",
released: "2020",
genres: "country rap",
}
设置 DynamoDB Jump to heading
我们在此过程中的第一步是生成 AWS 凭证,以便以编程方式访问 DynamoDB。
生成凭证:
- 访问 https://console.aws.amazon.com/iam/ 并进入 "Users" 部分。
- 点击 Create user 按钮,填写 User name 字段(可以使用
denamo
)并选择 Programmatic access 类型。 - 点击 Next
- 选择 Attach policies directly 并搜索
AmazonDynamoDBFullAccess
。在结果中勾选此策略旁边的复选框。 - 点击 Next 和 Create user
- 在生成的 Users 页面上,点击进入您刚刚创建的用户
- 点击 Create access key
- 选择 Application running outside AWS
- 点击 *Create
- 点击 Download .csv file 以下载您刚刚创建的凭证。
创建数据库表:
- 访问 https://console.aws.amazon.com/dynamodb 并点击 Create table 按钮。
- 填写 Table name 字段为
songs
,Partition key 为title
。 - 向下滚动并点击 Create table。
- 表创建完成后,点击表名并找到其 General information
- 在 Amazon Resource Name (ARN) 下,记下新表的区域(例如 us-east-1)。
编写应用程序 Jump to heading
创建一个名为 index.js
的文件并插入以下内容:
import {
json,
serve,
validateRequest,
} from "https://deno.land/x/sift@0.6.0/mod.ts";
// AWS 有一个适用于浏览器的官方 SDK。由于大多数 Deno Deploy 的 API 与浏览器的 API 相似,因此相同的 SDK 也适用于 Deno Deploy。
// 因此我们导入 SDK 以及一些插入和检索数据所需的类。
import {
DynamoDBClient,
GetItemCommand,
PutItemCommand,
} from "https://esm.sh/@aws-sdk/client-dynamodb";
// 通过提供您的区域信息创建客户端实例。
// 凭证是从环境变量中获取的,我们在 Deno Deploy 上的项目创建步骤中设置了这些变量。
const client = new DynamoDBClient({
region: Deno.env.get("AWS_TABLE_REGION"),
credentials: {
accessKeyId: Deno.env.get("AWS_ACCESS_KEY_ID"),
secretAccessKey: Deno.env.get("AWS_SECRET_ACCESS_KEY"),
},
});
serve({
"/songs": handleRequest,
});
async function handleRequest(request) {
// 该端点允许 GET 和 POST 请求。GET 请求需要名为 "title" 的参数。POST 请求需要包含以下字段的请求体。
// validateRequest 确保请求满足提供的条件。
const { error, body } = await validateRequest(request, {
GET: {
params: ["title"],
},
POST: {
body: ["title", "artist", "album", "released", "genres"],
},
});
if (error) {
return json({ error: error.message }, { status: error.status });
}
// 处理 POST 请求。
if (request.method === "POST") {
try {
// 当我们想要与 DynamoDB 交互时,我们使用客户端实例发送命令。这里我们发送 PutItemCommand 以插入请求中的数据。
const {
$metadata: { httpStatusCode },
} = await client.send(
new PutItemCommand({
TableName: "songs",
Item: {
// 这里 'S' 表示值为字符串类型,'N' 表示数字类型。
title: { S: body.title },
artist: { S: body.artist },
album: { S: body.album },
released: { N: body.released },
genres: { S: body.genres },
},
}),
);
// 在成功的 put item 请求中,dynamo 返回 200 状态码(奇怪)。因此我们测试状态码以验证数据是否已插入,并返回请求提供的数据作为确认。
if (httpStatusCode === 200) {
return json({ ...body }, { status: 201 });
}
} catch (error) {
// 如果在请求过程中出现问题,我们记录错误以供参考。
console.log(error);
}
// 如果执行到这里,意味着插入未成功。
return json({ error: "couldn't insert data" }, { status: 500 });
}
// 处理 GET 请求。
try {
// 我们从请求中获取标题并发送 GetItemCommand 以检索歌曲的信息。
const { searchParams } = new URL(request.url);
const { Item } = await client.send(
new GetItemCommand({
TableName: "songs",
Key: {
title: { S: searchParams.get("title") },
},
}),
);
// Item 属性包含所有数据,因此如果它不为 undefined,我们继续返回标题的信息。
if (Item) {
return json({
title: Item.title.S,
artist: Item.artist.S,
album: Item.album.S,
released: Item.released.S,
genres: Item.genres.S,
});
}
} catch (error) {
console.log(error);
}
// 如果在数据库请求期间抛出错误或数据库中未找到 Item,我们可能会到达这里。
// 我们用一条通用消息反映这两种情况。
return json(
{
message: "couldn't find the title",
},
{ status: 404 },
);
}
在您的新项目中初始化 git 并将其推送到 GitHub。
部署应用程序 Jump to heading
现在我们已经准备好了一切,让我们部署您的新应用程序吧!
- 在浏览器中访问 Deno Deploy 并链接您的 GitHub 账户。
- 选择包含您新应用程序的仓库。
- 您可以为您的项目命名或允许 Deno 为您生成一个名称。
- 在 Entrypoint 下拉菜单中选择
index.js
- 点击 Deploy Project
为了使您的应用程序正常工作,我们需要配置其环境变量。
在项目的成功页面或项目仪表板上,点击 Add environmental variables。在 Environment Variables 下,点击 + Add Variable。创建以下变量:
AWS_ACCESS_KEY_ID
- 使用您下载的 CSV 文件中的值。AWS_SECRET_ACCESS_KEY
- 使用您下载的 CSV 文件中的值。AWS_TABLE_REGION
- 使用您的表所在的区域。
点击保存变量。
让我们测试一下 API。
POST 一些数据。
curl --request POST --data \
'{"title": "Old Town Road", "artist": "Lil Nas X", "album": "7", "released": "2019", "genres": "Country rap, Pop"}' \
--dump-header - https://<project_name>.deno.dev/songs
获取标题的信息。
curl https://<project_name>.deno.dev/songs?title=Old%20Town%20Road
恭喜您学会了如何在 Deno Deploy 中使用 DynamoDB!