Firebase + Datastore = need_index - PullRequest
0 голосов
/ 23 мая 2018

Я работаю через учебник appengine + go, который подключается к Firebase: https://cloud.google.com/appengine/docs/standard/go/building-app/. Код доступен по адресу https://github.com/GoogleCloudPlatform/golang-samples/tree/master/appengine/gophers/gophers-6,, который, кроме моих ключей Firebase, идентичен.

У меня он работает локально, просто отлично под dev_appserver.py, и он запрашивает Vision API и добавляет метки.Однако после развертывания в appengine я получаю ошибку индекса в хранилище данных.Если я иду в консоль Firebase, я вижу коллекцию (Post) и поле (Опубликовано), которое является отметкой времени.

Если я изменю эту строку: https://github.com/GoogleCloudPlatform/golang-samples/blob/master/appengine/gophers/gophers-6/main.go#L193, чтобы удалить Order("-Posted")тогда все работает (важно отметить, что любой вызов Order вызывает его ошибку, за исключением того, что опубликованные мной тестовые записи поступают в случайном порядке.

При запуске в appengine появляется сообщение об ошибке: «Получение сообщений»: Ошибка API 4 (datastore_v3: NEED_INDEX): не найдено соответствующего индекса. "

Я попытался создать составной индекс или выполнить локальное тестирование с помощью --require_indexes=true, но это не помогло мне отладить проблему.

Редактировать: я переместил это, чтобы использовать библиотеки Firebase Datastore напрямую, вместо обновлений GCP. Я никогда не решал эту конкретную проблему, но смог продвинуться вперед с моим реально работающим приложением:)

1 Ответ

0 голосов
/ 23 мая 2018

По умолчанию локальный сервер разработки автоматически создает составные индексы, необходимые для фактических запросов, вызываемых в вашем приложении.От Создание индексов с использованием сервера разработки :

Веб-сервер разработки ( dev_appserver.py ) автоматически добавляет элементы в этот файл, когда приложение пытается выполнитьзапрос, для которого нужен индекс, для которого нет соответствующей записи в файле конфигурации.

Если на сервере разработки вы выполняете каждый запрос, который будет выполнять ваше приложение, сервер разработки сгенерирует полный список записей.в файле index.yaml.

Когда веб-сервер разработки добавляет сгенерированное определение индекса к index.yaml, он делает это ниже следующей строки, вставляя ее при необходимости:

# AUTOGENERATED

Веб-сервер разработки считает все определения индекса ниже этой строки автоматическими и может обновлять существующие определения ниже этой строки, когда приложение выполняет запросы.

Но вам также необходимо развернуть сгенерированные конфигурации индекса вхранилище данных и пусть хранилище данных обновляет информацию об индексировании (т.е.индексы для входа в состояние Serving) для соответствующих запросов, чтобы не возникла ошибка NEED_INDEX.Начиная с Обновление индексов :

Вы загружаете файл конфигурации index.yaml в Cloud Datastore с помощью команды gcloud.Если файл index.yaml определяет какие-либо индексы, которые не существуют в Cloud Datastore, эти новые индексы создаются.

Для Cloud Datastore может потребоваться некоторое время, чтобы создать все индексы и, следовательно, эти индексы выиграли 'быть немедленно доступным для App Engine.Если ваше приложение уже настроено на получение трафика, то могут возникать исключения для запросов, для которых требуется индекс, который еще находится в процессе создания.

Чтобы избежать исключений, необходимо выделить время для построения всех индексов.,Для получения дополнительной информации и примеров создания индексов см. Развертывание приложения Go .

Чтобы загрузить конфигурацию индекса в Cloud Datastore, выполните следующую команду из каталога, где расположен ваш index.yaml.:

gcloud datastore create-indexes index.yaml

Информацию см. В справочнике gcloud datastore .

. Вы можете использовать консоль GCP, чтобы проверять состояние своих индексов .

...