开发者问题收集

AWS NodeJS TypeScript SDK V3 DynamoDB PutItemCommand - TypeError:无法读取未定义的属性(读取“0”)

2023-06-20
3033

我正在构建一个应用程序来管理有关不同媒体(例如视频、图像等)的信息。该应用程序使用 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 对象获取它们。

3个回答

由于您使用的是 DynamoDBDocumentClient ,因此您需要使用 "@aws-sdk/lib-dynamodb" 中的 PutCommand ,而不是 @aws-sdk/client-dynamodb 中的 PutItemCommand

请改用此导入:

import { PutCommand } from "@aws-sdk/lib-dynamodb";

在我看来,这是亚马逊的疏忽。应该只有一组命令,但我想这是有道理的。

Tsar Bomba
2023-09-13

我今天在使用 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' }  
}
BTR
2023-07-05

异常不是来自 DynamoDB,而是来自您的代码逻辑本身。我的建议是确保您正确解析事件对象。

console.log(event);
const item = JSON.parse(event.body!);
console.log(typeof(item))
console.log(item);

添加这些日志语句应该会为您提供足够的信息来解决问题。

Leeroy Hannigan
2023-06-20