AWS NodeJS TypeScript SDK V3 DynamoDB PutItemCommand - 类型错误:无法读取未定义的属性(读取 '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:Cannot read properties of undefined (reading '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 对象中获取它们。
答案#1
因为你正在使用 DynamoDBDocumentClient,所以你需要使用来自 "@aws-sdk/lib-dynamodb" 的 PutCommand,而不是来自 @aws-sdk/client-dynamodb 的 PutItemCommand。
请使用此导入方式:
import { PutCommand } from "@aws-sdk/lib-dynamodb";
依我看,这是亚马逊的疏忽。应该只有一套命令,但我猜这也说得通。
答案#2
今天我在使用 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' }
}
