亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 GO Lambda 中處理 DynamoDB 項目

在 GO Lambda 中處理 DynamoDB 項目

Go
慕桂英4014372 2022-11-28 10:28:42
我正在執行一個簡單的表掃描以從我的 DynamoDB 表中獲取所有項目,products. 這是整個 Lambda:package mainimport (    "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 形式的項目)?
查看完整描述

1 回答

?
慕碼人2483693

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 表并將其作為響應返回是非常昂貴的,你應該避免它。


查看完整回答
反對 回復 2022-11-28
  • 1 回答
  • 0 關注
  • 162 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號