Node.js中AWS-SDK v3的TransactWriteItemsCommand调用报错求助
问题排查与修复
错误原因
你错误地将低级DynamoDB客户端的TransactWriteItemsCommand与文档客户端DynamoDBDocumentClient混用了。低级客户端要求Item必须是DynamoDB的AttributeValue格式(如{ S: "myPK" }),而文档客户端需要搭配@aws-sdk/lib-dynamodb提供的TransactWriteCommand使用,它会自动完成原生JS类型到DynamoDB类型的转换,不需要手动序列化。
修复后的代码
const { DynamoDBClient } = require('@aws-sdk/client-dynamodb'); const { DynamoDBDocumentClient, TransactWriteCommand } = require('@aws-sdk/lib-dynamodb'); let options = { maxRetries: 3, httpOptions: { timeout: 5000, }, }; const client = new DynamoDBClient(options); const input = { TransactItems: [ { Put: { TableName: "my-table-name", Item: { PK: "myPK", SK: "mySK", name: "aname", code: "acode", price: 200, createdAt: "2023-11-07T13:36:12.045Z", updatedAt: "2023-11-07T13:36:12.045Z" } } } ] }; const ddbDocClient = DynamoDBDocumentClient.from(client); ddbDocClient.send(new TransactWriteCommand(input));
关键注意点
- 文档客户端
DynamoDBDocumentClient必须使用@aws-sdk/lib-dynamodb包内的命令(如TransactWriteCommand、PutCommand等),而非@aws-sdk/client-dynamodb包内的低级命令 - 若坚持使用低级客户端的
TransactWriteItemsCommand,则需要手动将Item的每个字段转换为AttributeValue格式,例如:PK: { S: "myPK" }、price: { N: "200" }
内容的提问来源于stack exchange,提问作者Eb3us
相关产品推荐
相关产品推荐

