#amazon-web-services #go #amazon-dynamodb
#amazon-веб-сервисы #Вперед #amazon-dynamodb
Вопрос:
Я пытаюсь разбить записи на страницы из таблицы, созданной в 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 := amp;domain.SupplierTableItems{}
all := amp;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
Есть ли возможность проверить, превысил ли вызов, выполненный для извлечения элементов, количество записей в таблице, и просто указать количество оставшихся записей.
Комментарии:
1. Вам нужно показать свой код, особенно вокруг строки 41
supplier_service.go
(и, возможно, ее вызывающего). Это не просто вопрос API, вы неправильно используете объект и пытаетесь разыменоватьnil
указатель.2. Я добавил код функции, используемой для извлечения элементов
Ответ №1:
Ваша ошибка не имеет большого отношения к разбивке на страницы DynamoDB, вы просто пытаетесь получить доступ к чему-то, чего там нет, где-то рядом /Users/hammadali/source/ph-supplier-service/application/supplier_service.go:41
Чтобы ответить на ваш вопрос иначе: да, DynamoDB сообщает вам, когда разбиение на страницы завершено. Из документов:
- Если результат содержит элемент LastEvaluatedKey и он не равен нулю, перейдите к шагу 2.
- Если в результате нет LastEvaluatedKey, больше элементов для извлечения нет.
Комментарии:
1. Спасибо. Если таблица содержит 10 элементов, и вы устанавливаете ограничение на 6 одновременно. При первом вызове я получаю 6 элементов и LastEvaluatedKey. Второй вызов с эксклюзивным STARTKEY в качестве LastEvaluatedKey приведет к ошибке недопустимой памяти. Есть ли для этого обходной путь?
2. @HammadAli Внимательно прочитайте ответ, он совершенно ясен — «Если в результате нет LastEvaluatedKey, больше элементов для извлечения нет».. Но вы все еще спрашиваете: «Второй вызов с эксклюзивным STARTKEY в качестве LastEvaluatedKey приведет к ошибке недопустимой памяти. Есть ли для этого обходной путь?». Решение состоит в том, чтобы проверить, есть ли
LastEvaluatedKey
поле в ответе — если нет, вы закончили разбиение на страницы.3. @HammadAli вы должны отметить этот ответ как принятый, поскольку он на 100% соответствует вашему вопросу…
4. Боюсь, это не решает мою проблему. Я пытаюсь найти способ обработать ошибку, когда элементов в таблице меньше, чем call в запросе. Поскольку на данный момент он выдает мне недопустимый адрес памяти.
5. Снова. Если имеется 400 элементов, шаг 1: я запрашиваю 300 элементов; я получаю 300 элементов и LastEvaluatedKey. Шаг 2: я запрашиваю 300 элементов с помощью LastEvaluatedKey; Программа паникует из-за недопустимого адреса памяти или разыменования нулевого указателя. Я хочу, чтобы программа выводила оставшиеся 100 элементов без LastEvaluatedKey