AWS NodeJS TypeScript SDK V3 DynamoDB PutItemCommand类型错误排查
DynamoDBDocumentClient插入数据时抛出TypeError: Cannot read properties of undefined (reading '0')
问题原因
你混用了DynamoDB基础客户端与Document客户端的命令。PutItemCommand属于@aws-sdk/client-dynamodb,是给原生DynamoDBClient使用的,需要手动指定字段类型;而你使用的DynamoDBDocumentClient(来自@aws-sdk/lib-dynamodb)需要搭配对应的PutCommand,它会自动完成JS对象与DynamoDB数据格式的编解码,无需手动处理类型。
修正后的代码
import { DynamoDBClient } from '@aws-sdk/client-dynamodb'; import { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda'; import { DynamoDBDocumentClient, PutCommand } from '@aws-sdk/lib-dynamodb'; // 导入正确的PutCommand export async function postVideo( event: APIGatewayProxyEvent, ddbClient: DynamoDBClient ): Promise<APIGatewayProxyResult> { const ddbDocClient = DynamoDBDocumentClient.from(ddbClient); // 处理请求体为空的情况 if (!event.body) { return { statusCode: 400, body: JSON.stringify({ error: "请求体不能为空" }) }; } const item = JSON.parse(event.body); // 校验必要字段是否存在 if (!item.owner || !item.title) { return { statusCode: 400, body: JSON.stringify({ error: "owner和title字段为必填项" }) }; } const currentDateTime = new Date().toISOString(); const pk = `VIDEO`; const sk = `${item.owner}#${item.title}#${currentDateTime}`; item.PK = pk; item.SK = sk; try { const result = await ddbDocClient.send( new PutCommand({ // 使用Document客户端对应的PutCommand TableName: process.env.TABLE_NAME, Item: item, }) ); console.log(result); return { statusCode: 201, body: JSON.stringify({ PK: pk, SK: sk }), }; } catch (error) { console.error('插入数据失败:', error); return { statusCode: 500, body: JSON.stringify({ error: "插入视频信息失败" }) }; } }
额外检查项
- 确保环境变量
TABLE_NAME已正确配置为你的DynamoDB表名 - 确认DynamoDB表的主键(PK/SK)配置与代码中设置的字段一致
内容的提问来源于stack exchange,提问作者Luis Lomba Martínez
相关产品推荐
相关产品推荐

