在 GO Lambda 中处理 DynamoDB 项目

我正在执行一个简单的表扫描以从我的 DynamoDB 表中获取所有项目,products. 这是整个 Lambda:


package main


import (

    "context"

    "fmt"


    "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/service/dynamodb"

)


type Product struct {

    productUUID string

    name        string

    description string

    brand       string

    price       string

    category    string

    dateAdded   string

}


func handleRequest() (string, error) {

    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)

    }


    for _, item := range out.Items {

        fmt.Println(item)

    }


    return "Items", nil // Temporary debugging return (always 200). I'd like to return a json object here

}


func main() {

    lambda.Start(handleRequest)

}

当我取回数据时,我可以按以下形式打印出每一项:


map[brand:0xc0002f38a8 category:0xc0002f3848 dateAdded:0xc0002f3830 name:0xc0002f3800 price:0xc0002f37a0 productUUID:0xc0002f3818]

如何将这些项目转换为我在上面定义的结构,然后返回 lambda 预期的 json 响应(基本上是 HTTP 响应代码和 json 形式的项目)?


慕桂英4014372
浏览 111回答 1
1回答

慕码人2483693

扫描表格会返回项目地图,并且您希望将地图转换为结构,因此为了将地图列表转换为您想要使用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 mainimport (    "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 表并将其作为响应返回是非常昂贵的,你应该避免它。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go