1 回答
TA贡献1860条经验 获得超9个赞
扫描表格会返回项目地图,并且您希望将地图转换为结构,因此为了将地图列表转换为您想要使用aws-sdk-go-v2下的attributevalue.UnmarshalListOfMaps的结构。在以前的版本中,它位于dynamodbattribute中,但他们决定更改 v2 中的包。
products := []Product{}
err = attributevalue.UnmarshalListOfMaps(out.Items, &products)
if err != nil {
panic(fmt.Sprintf("failed to unmarshal Dynamodb Scan Items, %v", err))
}
productsJson, err := json.Marshal(products)
if err != nil {
panic(err)
}
我在 Product 结构中看到的一个问题是您需要使用导出的名称,还需要为结构字段定义 json 标签,否则数据将不会解组到结构中。因此,为了将表中的扫描项目返回到 json 响应中,您的代码应如下所示。
package main
import (
"context"
"encoding/json"
"fmt"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambda"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue"
"github.com/aws/aws-sdk-go-v2/service/dynamodb"
)
type Product struct {
ProductUUID string `json:"productUUID"`
Name string `json:"name"`
Description string `json:"description"`
Brand string `json:"brand"`
Price string `json:"price"`
Category string `json:"category"`
DateAdded string `json:"dateAdded"`
}
func handleRequest() (events.APIGatewayProxyResponse, error) {
products := []Product{}
cfg, err := config.LoadDefaultConfig(context.TODO(), func(o *config.LoadOptions) error {
o.Region = "us-east-2"
return nil
})
if err != nil {
panic(err)
}
svc := dynamodb.NewFromConfig(cfg)
out, err := svc.Scan(context.TODO(), &dynamodb.ScanInput{
TableName: aws.String("products"),
})
if err != nil {
panic(err)
}
err = attributevalue.UnmarshalListOfMaps(out.Items, &products)
if err != nil {
panic(fmt.Sprintf("failed to unmarshal Dynamodb Scan Items, %v", err))
}
productsJson, err := json.Marshal(products)
if err != nil {
panic(err)
}
resp := events.APIGatewayProxyResponse{
StatusCode: 200,
IsBase64Encoded: false,
Body: string(productsJson),
Headers: map[string]string{
"Content-Type": "application/json",
},
}
return resp, nil
}
func main() {
lambda.Start(handleRequest)
}
PS: 扫描整个 dynamo 表并将其作为响应返回是非常昂贵的,你应该避免它。
- 1 回答
- 0 关注
- 110 浏览
添加回答
举报