请求中的资源字段值无效

Invalid resource field value in the request

我正在使用 Go SDK @ cloud.google.com/go/firestore GoDoc here 调用 Firestore。它在 App Engine 上运行良好,但我最近向 Cloud 运行 添加了一项新服务。此新服务调用旧服务使用的相同代码,但该代码 - 适用于 App Engine - 在 Cloud 运行 上引发错误:rpc error: code = InvalidArgument desc = Invalid resource field value in the request

引发错误的特定代码行是:

snap, err := client.Collection(queryable.CollectionName()).Doc(queryable.GetFirestoreID()).Get(ctx)
if err != nil {
    return fmt.Errorf("couldn't read document with id: %v error: %w", queryable.GetFirestoreID(), err)
}

其中 queryable 是一个接口,而 CollectionName() return 是一个常量字符串,所以这不是问题所在(此外,如果那是问题所在,它会 return 一个不同的错误)。

我用更多的文字包裹了错误信息,所以完整的错误信息可以让你了解堆栈:DoTaxDog: allDB.UpdateData: firestoreCRUD.ReadSchema: error in Firestore's ReadSchema: couldn't read document with id: AGPFiyoJdMAmurVNqHYxvKHEb error: rpc error: code = InvalidArgument desc = Invalid resource field value in the request. allDB.UpdateData 函数在此代码和 App Engine 中的 运行 代码之间共享,因此出于所有意图和目的,我在 App Engine 上的代码是 运行 和我的代码'云 运行 上的 m 运行 相同。

部署信息

我在 Gitlab 中用这个部署:

deploy_run:
  image: google/cloud-sdk
  stage: deploy
  only:
    - master
  script:
    - echo $DEPLOY_KEY > /tmp/$CI_PIPELINE_ID.json
    - gcloud auth activate-service-account --key-file /tmp/$CI_PIPELINE_ID.json
    - gcloud builds submit --tag gcr.io/project-name/project-name --project project-name
    - gcloud run deploy project-name --image gcr.io/project-name/project-name --platform managed --project project-name --region=us-central1 --allow-unauthenticated

尝试解决问题

  1. 我尝试重新运行 请求。没有骰子。
  2. 我检查了同一请求是否正在本地主机上运行。它正在本地主机上工作。
  3. 我检查了我是否能够在 App Engine 上发出请求(不是相同的请求,而是几乎相同的请求)。它仍在 App Engine 上工作。
  4. 我查看了 GoDoc。它不引用此错误。
  5. 我查看了 Google 云文档。他们似乎说这是一条通用错误消息。我找不到针对 Firestore 的此错误消息的具体参考。
  6. 我在网上搜索了答案。没有骰子。

基础设施检查

我以前遇到过这个问题,但我不记得上次是怎么解决的所以我做这个post。

已修复!云运行不设GOOGLE_CLOUD_PROJECTenvironment variable。当我通过此 Go 代码初始化 Firestore 客户端时:firestore.NewClient(ctx, projectID, option.WithCredentials(credentials)) projectID 变量的值为空字符串。如果未设置 projectID 变量,Firestore 的 Go SDK 函数 NewClient 不会抛出错误。相反,你第一次发出请求时,它 returns 来自底层服务的 rpc 错误,这是我最初看到的:rpc error: code = InvalidArgument desc = Invalid resource field value in the request

为了解决这个问题,我将这段代码添加到我的 gcloud run deploy 命令中:--set-env-vars=GOOGLE_CLOUD_PROJECT=project-name

感谢向我询问有关代码本身的更多详细信息的评论者!

[更新] 我打开了一个 Issue in Github and fixed it in a PR which was accepted。此问题已关闭,不应再次出现。