【问题标题】:AWS dynamoDb pagination with limitAWS dynamoDb 分页限制
【发布时间】:2020-12-16 08:40:07
【问题描述】:

我正在尝试对 dynamoDb 中创建的表中的条目进行分页 有没有办法检查表项是否超出。

例如,如果我调用从表中获取项目,则会收到以下错误


PANIC: runtime error: invalid memory address or nil pointer dereference
goroutine 51 [running]:
github.com/urfave/negroni.(*Recovery).ServeHTTP.func1(0xdfae028, 0xc000186028, 0xc0002162d0, 0xc000154200)
    /Users/hammadali/go/pkg/mod/github.com/urfave/negroni@v1.0.0/recovery.go:159 +0xcb
panic(0x498ea20, 0x51f4410)
    /usr/local/Cellar/go/1.14.5/libexec/src/runtime/panic.go:969 +0x166
github.com/prohousing-as/ph-supplier-service/application.(*SupplierService).GetAllSuppliers(0xc0002cc300, 0xc00002a270, 0x24, 0xbb8, 0xc0004403e0, 0x0, 0x0)
    /Users/hammadali/source/ph-supplier-service/application/supplier_service.go:41 +0x330
github.com/prohousing-as/ph-supplier-service/ui.(*SupplierController).GetAllSupplier(0xc000526ed0, 0xdfae028, 0xc000186028, 0xc0003be300)
    /Users/hammadali/source/ph-supplier-service/ui/supplier_controller.go:40 +0x139
net/http.HandlerFunc.ServeHTTP(0xc000527170, 0xdfae028, 0xc000186028, 0xc0003be300)
    /usr/local/Cellar/go/1.14.5/libexec/src/net/http/server.go:2041 +0x44
github.com/gorilla/mux.(*Router).ServeHTTP(0xc0002e40c0, 0xdfae028, 0xc000186028, 0xc0003be100)
    /Users/hammadali/go/pkg/mod/github.com/gorilla/mux@v1.7.4/mux.go:210 +0xe2

获取所有项目的函数

// fetches the items from dynamoDb and stores it in res
res, err := s.SupplierRepo.GetAllSupplier(uuid, limit)
    if err != nil {
        fmt.Println("from application: ", err)
        return nil, err
    }
    item := &domain.SupplierTableItems{}
    all := &domain.AllSupplierItems{}
    // Looping over the result and appending it on the list
    for _, i := range res.Items {
        err = dynamodbattribute.UnmarshalMap(i, item)
        all.Collection = append(all.Collection, *item)
        if err != nil {
            fmt.Println(err)
        }
    }
    // storing lastEvaluatedKey for pagination
    all.LastEvaluatedKey = *res.LastEvaluatedKey["uuid"].S
    return all, nil

是否有办法检查获取项目的调用是否超过了表条目,只提供剩余的条目数。

【问题讨论】:

  • 您需要展示您的代码,尤其是在supplier_service.go 的第 41 行附近(可能还有它的调用者)。这不仅仅是一个 API 问题,您在滥用对象并试图取消引用 nil 指针。
  • 我已经添加了用于获取项目的函数的代码

标签: amazon-web-services go amazon-dynamodb


【解决方案1】:

您的错误与 DynamoDB 的分页没有太大关系,您只是在尝试访问不存在的东西,在 /Users/hammadali/source/ph-supplier-service/application/supplier_service.go:41 附近的某个地方

另外回答您的问题:是的,DynamoDB 会在分页完成时告诉您。 From the docs:

  • 如果结果包含 LastEvaluatedKey 元素并且它不为 null,请继续执行步骤 2。
  • 如果结果中没有 LastEvaluatedKey,则没有要检索的项目。

【讨论】:

  • 谢谢。如果表包含 10 个项目,并且您一次将限制设置为 6 个。在第一次通话中,我得到 6 个项目和 LastEvaluatedKey。使用 ExclusiveStartKey 作为 LastEvaluatedKey 的第二次调用将通过无效的内存错误。有解决办法吗?
  • @HammadAli 仔细阅读答案,很清楚 - “如果结果中没有 LastEvaluatedKey,则没有更多项目要检索。”。但是您仍然在问:“使用 ExclusiveStartKey 作为 LastEvaluatedKey 的第二次调用将通过无效的内存错误。有解决方法吗?”。解决方案是检查响应中是否有 LastEvaluatedKey 字段 - 如果没有,则您已完成分页。
  • @HammadAli 您应该将此答案标记为已接受,因为它是您问题的 100% 答案...
  • 恐怕这并不能解决我的问题。当表中的项目少于查询中的调用时,我试图找到一种方法来处理错误。目前它给了我无效的内存地址。
  • 再次。如果有400项,第一步:我查询300项;我得到 300 个项目和 LastEvaluatedKey。第二步:我用 LastEvaluatedKey 查询了 300 个项目;程序因无效的内存地址或 nil 指针取消引用而恐慌。我希望程序在没有 LastEvaluatedKey 的情况下输出剩余的 100 个项目
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-18
  • 1970-01-01
  • 2019-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多