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 關注
- 162 瀏覽
添加回答
舉報
