【问题标题】:Firebase + Datastore = need_indexFirebase + 数据存储 = need_index
【发布时间】:2018-05-23 07:46:49
【问题描述】:

我正在学习 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) 和作为时间戳的字段 (Posted)。

如果我更改此行:https://github.com/GoogleCloudPlatform/golang-samples/blob/master/appengine/gophers/gophers-6/main.go#L193 以删除Order("-Posted"),那么一切正常(重要的是要注意任何Order 调用都会导致它出错,除了我发布的测试记录是随机顺序的。

在appengine中运行时的错误信息是:“Getting posts: API error 4 (datastore_v3: NEED_INDEX): no matching index found.”

我尝试创建复合索引,或使用 --require_indexes=true 在本地进行测试,但它没有帮助我调试问题。

编辑:我已将其移至直接使用 Firebase 的 Datastore 库,而不是 GCP 更新。我从来没有解决过这个特定的问题,但能够继续我的应用程序实际工作:)

【问题讨论】:

    标签: firebase google-app-engine google-cloud-datastore


    【解决方案1】:

    默认情况下,本地开发服务器会自动创建应用中调用的实际查询所需的复合索引。来自Creating indexes using the development server

    开发Web服务器(dev_appserver.py)自动添加 当应用程序尝试执行一个查询时,该文件中的项目 需要一个在 配置文件。

    在开发服务器中,如果您执行应用程序的每个查询 将使,开发服务器将生成一个完整的列表 index.yaml 文件中的条目。

    当开发 Web 服务器将生成的索引定义添加到 index.yaml,它会在下面的行下面插入,如果 必要的:

    # AUTOGENERATED
    

    开发网络服务器考虑所有低于此的索引定义 行是自动的,它可能会更新下面的现有定义 此行作为应用程序进行查询。

    但您还需要将生成的索引配置部署到 Datastore 并让 Datastore 更新索引信息(即进入Serving 状态的索引),以使各个查询不会遇到NEED_INDEX 错误。来自Updating indexes

    您将 index.yaml 配置文件上传到 Cloud Datastore 使用gcloud 命令。如果index.yaml 文件定义了任何 Cloud Datastore 中不存在的索引,这些新索引是 建成。

    Cloud Datastore 可能需要一段时间才能创建所有索引和 因此,这些索引不会立即可供 App Engine 使用。 如果您的应用程序已配置为接收流量,则异常 对于需要仍在 构建过程。

    为避免异常,您必须为所有索引的构建留出时间。 有关创建索引的更多信息和示例,请参阅 Deploying a Go App.

    要将您的索引配置上传到 Cloud Datastore,请运行 从 index.yaml 所在的目录执行以下命令:

    gcloud datastore create-indexes index.yaml
    

    有关信息,请参阅gcloud datastore reference

    您可以使用 GCP 控制台,check the status of your indexes

    【讨论】:

    • 感谢您的帮助!我认为这是部分迁移到 Firebase 的结果。如果我加载 GCP 的 Datastore 部分,它会将我重定向到 Firebase (https://console.firebase.google.com/project/$project-id/database/firestore/data~2F)。我在那里看到我的文档,可以创建,但是任何排序都会因该错误而中断。如果我尝试通过index.yaml 创建索引,它会出错并说索引不是必需的,因为它只在一个属性上。
    • 这可能是因为您最初在 Firebase 控制台中添加了您的项目。到目前为止,可以在单个项目的上下文中选择 Firebase 或 Datastore。更多关于它的信息here 在笔记中。
    猜你喜欢
    • 2016-12-30
    • 1970-01-01
    • 2019-02-18
    • 2017-05-15
    • 2019-01-16
    • 2019-02-05
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多