网站搜索

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' }  
}