firebase - 无法确定使用事务更新文档的 Firestore REST API 调用的正确顺序
问题描述
我无法找出正确的调用顺序来更新事务中的文档。我正在使用 firebase v1beta1 REST API。我正在使用以下序列:
- 调用“beginTransaction”,创建一个读写事务
- 为感兴趣的文档调用“get”,从 1 传递事务
- 调用“提交”,在提交中写入文档更新
开始读写事务时失败。我收到“权限缺失或权限不足”。错误。请注意,数据库处于测试模式,(所有读写都打开,仅用于此测试)所以我不认为这是权限错误。
我查看了 firebase 文档,除了 REST 之外,还有所有其他客户端的事务示例。所以我刚刚从阅读 REST API 参考文档中得出了上面的顺序
我检查过数据库处于测试模式,所有读写都打开。这是。我可以使用 createDocument、删除和更新 REST API 在数据库中创建、更新或删除集合
我使用了 google api explorer 来确保我有正确的请求结构 https://developers.google.com。- 然后搜索 API 使用 firestore.projects.databases.documents.{api you want}
我试过调用 beginTransaction 来成功创建一个只读事务,它工作正常。
(数据库的安全规则)
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write;
}
}
}
- 我试过调用 beginTransaction 来成功创建一个只读事务,它工作正常。
(这将返回一个事务)
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"
}
}
这就是我所期望的,因为它是一个只读事务
解决方案
(感谢 Juan Lara)正确的顺序是 1. beginTransaction(确保我通过身份验证)
2. getDocument(从 1 传入 readWrite 事务) 3. commit(传入事务并包括任何更新)
提交,也可以在没有 txn 的情况下使用,以执行一系列自动更新
推荐阅读
- reactjs - 组件在重新渲染时失去功能
- php - 将每个 url 重定向到索引时得到 404
- javascript - 我有一个小问题要混淆,当我单击按钮添加新表时,它不能在下面添加
- processing - Neovim 如何从 Powershell 调用命令?
- javascript - 为什么我们需要在 rxjs observable 中实现 unsubscribe?
- javascript - backdraft 组件是否对插入它的 dom 元素有任何可见性?
- python - XPath 文本和节点按实际顺序排列
- python - Python Pandas 仅对列进行分组
- javascript - 在没有外部包的 Javascript 中将带时区的时间戳字符串转换为 UTC
- c - Fmod 不能按预期工作(c 编程)