首页 > 解决方案 > 无法确定使用事务更新文档的 Firestore REST API 调用的正确顺序

问题描述

我无法找出正确的调用顺序来更新事务中的文档。我正在使用 firebase v1beta1 REST API。我正在使用以下序列:

  1. 调用“beginTransaction”,创建一个读写事务
  2. 为感兴趣的文档调用“get”,从 1 传递事务
  3. 调用“提交”,在提交中写入文档更新

开始读写事务时失败。我收到“权限缺失或权限不足”。错误。请注意,数据库处于测试模式,(所有读写都打开,仅用于此测试)所以我不认为这是权限错误。

(数据库的安全规则)

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write;
    }
  }
}

(这将返回一个事务)

POST https://firestore.googleapis.com/v1beta1/projects/foo-bR-12345/databases/(default)/documents:beginTransaction
 {
 "options": {
  "readOnly": {
  }
 }
}

(这不是)

POST https://firestore.googleapis.com/v1beta1/projects/foo-bar-12345/databases/(default)/documents:beginTransaction
{
 "options": {
  "readWrite": {
  }
 }
}

这是我在开始读写事务时遇到的错误。我知道这看起来像是一个安全规则问题,但是如果您知道 url,则数据库是完全开放的。

{
    "error": {
        "code": 403,
        "message": "Missing or insufficient permissions.",
        "status": "PERMISSION_DENIED"
    }
}

我尝试的另一件事是,看看我的呼叫顺序是否正确

1)开始一个只读事务(工作)

2)在文档上调用get,将事务传入(工作)

3)调用commit,更新文档。此调用失败 - 出现错误

{
 "error": {
  "code": 400,
  "message": "Cannot modify entities in a read-only transaction.",
  "status": "INVALID_ARGUMENT"
 }
}

这就是我所期望的,因为它是一个只读事务

标签: firebaseresttransactionsgoogle-cloud-firestore

解决方案


(感谢 Juan Lara)正确的顺序是 1. beginTransaction(确保我通过身份验证)
2. getDocument(从 1 传入 readWrite 事务) 3. commit(传入事务并包括任何更新)

提交,也可以在没有 txn 的情况下使用,以执行一系列自动更新


推荐阅读