AWS NodeJS TypeScript SDK V3 DynamoDB PutItemCommand - TypeError:无法读取未定义的属性(读取“0”)
我正在构建一个应用程序来管理有关不同媒体(例如视频、图像等)的信息。该应用程序使用 DynamoDB 存储信息,我使用 TypeScript AWS SDK 连接到数据库。
我目前正在编写用于存储与视频相关的信息的部分,但是在尝试在 DynamoDB 表中插入对象时遇到了麻烦,我正在使用此代码来执行此操作:
import { DynamoDBClient, PutItemCommand } from '@aws-sdk/client-dynamodb';
import { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda';
import { DynamoDBDocumentClient } from '@aws-sdk/lib-dynamodb';
export async function postVideo(
event: APIGatewayProxyEvent,
ddbClient: DynamoDBClient
): Promise<APIGatewayProxyResult> {
const ddbDocClient = DynamoDBDocumentClient.from(ddbClient);
const item = JSON.parse(event.body!);
const currentDateTime = new Date().toISOString();
const pk = `VIDEO`;
const sk = `${item.owner}#${item.title}#${currentDateTime}`;
item.PK = pk;
item.SK = sk;
const result = await ddbDocClient.send(
new PutItemCommand({
TableName: process.env.TABLE_NAME,
Item: item,
})
);
console.log(result);
return {
statusCode: 201,
body: JSON.stringify({ PK: pk, SK: sk }),
};
}
我知道在使用 DynamoDBClient 时,我需要指定项目的每个字段的类型,因此我决定使用 DynamoDBDocumentClient 而不是直接使用 DynamoDBClient,这样就不必进行编组-解组,但是当我尝试将项目插入数据库时​​,它会引发 TypeError:无法读取未定义的属性(读取“0”)。
尝试插入项目时,它包含类似的内容这个:
{
owner: "Test",
title: "Test",
description: "Test",
link: "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
PK: "VIDEO",
SK: "Test#Test#2023-06-20T17:20:59.683Z",
}
我不知道我是否遗漏了什么。我猜是它没有正确获取项目的类型,但我认为它应该直接从 JS 对象获取它们。
由于您使用的是
DynamoDBDocumentClient
,因此您需要使用
"@aws-sdk/lib-dynamodb"
中的
PutCommand
,而不是
@aws-sdk/client-dynamodb
中的
PutItemCommand
。
请改用此导入:
import { PutCommand } from "@aws-sdk/lib-dynamodb";
在我看来,这是亚马逊的疏忽。应该只有一组命令,但我想这是有道理的。
我今天在使用 v3 SDK 时遇到了这个问题。此示例演示了如何为每个值定义类型。按照它的方法解决了我的问题: https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/dynamodb-example-table-read-write.html
不起作用:
const item = {
key: 'my-key',
value: 'my-value'
}
有效:
const item = {
key: { 'S': 'my-key' },
value: { 'S': 'my-value' }
}
异常不是来自 DynamoDB,而是来自您的代码逻辑本身。我的建议是确保您正确解析事件对象。
console.log(event);
const item = JSON.parse(event.body!);
console.log(typeof(item))
console.log(item);
添加这些日志语句应该会为您提供足够的信息来解决问题。