如何通过RPC监听firestore

2024-03-22

我想听firestore中的实时变化,而且我也只允许使用Go。由于 Firestore SDK for Go 没有任何选项来监听实时更改,因此我决定使用 firestore v1beta1 sdk。

我编写了以下代码来做到这一点

func TestRPCHandler(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
c, err := firestore.NewClient(context.Background())

databaseName := "projects/[project_name]/databases/(default)"
if err != nil {
    panic(err)
}

stream, err := client.Listen(context.Background())
if err != nil {
    panic(err)
}

request := &firestorepb.ListenRequest{
    Database:             databaseName,
    TargetChange:         &firestorepb.ListenRequest_AddTarget{
        AddTarget: &firestorepb.Target{
            TargetType:           &firestorepb.Target_Documents{
                Documents: &firestorepb.Target_DocumentsTarget{
                    Documents:    []string{"projects/[project_name]/databases/(default)/[collection_name]"} ,
                },
            },
        },
    },
}

if err := stream.Send(request); err != nil {
    panic(err)
}

if err := stream.CloseSend(); err != nil {
    panic(err)
}

for {
    resp, err := stream.Recv()
    if err == io.EOF {
        break
    }
    if err != nil {
        panic(err)
    }
}

   }

当我这样做时,代码不会检测到我在数据库中手动进行的任何更改。stream.Recv()只是返回 EOF 并立即退出。我什至尝试通过添加手动等待time.Sleep()但这也无济于事。


你不需要 beta SDK 或 hack 来实现这一点,我找到了解决方案,实际上非常简单。

The https://firebase.google.com/docs/firestore/query-data/listen https://firebase.google.com/docs/firestore/query-data/listen文档不包含 Go 的示例。

Go 的 firestore 客户端 API 的源代码有一个未导出的 watchStream,我们无法直接使用:https://github.com/googleapis/google-cloud-go/blob/master/firestore/watch.go#L130 https://github.com/googleapis/google-cloud-go/blob/master/firestore/watch.go#L130

对存储库的深入搜索表明,这实际上在 DocumentSnapshotIterator 和 QuerySnapshotIterator 上使用:https://github.com/googleapis/google-cloud-go/blob/master/firestore/docref.go#L644 https://github.com/googleapis/google-cloud-go/blob/master/firestore/docref.go#L644 and: https://github.com/googleapis/google-cloud-go/blob/master/firestore/query.go#L716 https://github.com/googleapis/google-cloud-go/blob/master/firestore/query.go#L716.

The Collection包含一个Snapshots方法返回我们想要的快照迭代器,之后一切都很简单,我们只需对其进行一个不定循环Next method.

Example:

cols, err := client.Collections(context.Background()).GetAll()

for _, col := range cols {
    iter := col.Snapshots(context.Background())
    defer iter.Stop()

    for {
        doc, err := iter.Next()
        if err != nil {
            if err == iterator.Done {
                break
            }
            return err
        }

        for _, change := range doc.Changes {
            // access the change.Doc returns the Document,
            // which contains Data() and DataTo(&p) methods.
            switch change.Kind {
            case firestore.DocumentAdded:
                // on added it returns the existing ones.
                isNew := change.Doc.CreateTime.After(l.startTime)
                // [...]
            case firestore.DocumentModified:
                // [...]
            case firestore.DocumentRemoved:
                // [...]
            }
        }
    }
}

您的,格拉西莫斯·马罗普洛斯,又名@kataras https://github.com/kataras/iris

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过RPC监听firestore 的相关文章

随机推荐

  • PHP 中与数值数组的关联

    我有一个关联数组 我想在数字中使用哪些键 我的意思是 数组有点像这样 countries array AD gt array AND Andorra BG gt array BGR Bulgaria 显然AD是0 BG是1 但是当我打印时
  • br 在 ul 中无效

    我的网站上有一个导航栏 HTML
  • 在mathematica中使用Input[]输入数据

    我怎样才能在这段代码中使输入命令对话框中的文本像这样 输入 1 元素 输入 2 元素 For k 1 k n k br Input Enter the i element AppendTo x br 确保您的变量匹配 您可以使用Row来构建
  • 为什么 Ruby 的“gets”包含结束换行符?

    我从不需要我得到的结尾换行符gets 有一半的时间我忘记了chomp它是一种痛苦 为什么它在那里 Like puts 听起来很相似 它被设计为与线条一起工作 使用 n特点 gets接受一个可选参数 用于 分割 输入 或 只是读取直到它到达
  • 页面不工作 尝试解锁被另一个线程锁定的互斥体

    我想启动我的应用程序 但它仍在 加载 早上还可以 现在不行了 我尝试使用其他端口 切换到稳定分支 重新启动计算机 但似乎没有任何效果 在其他应用程序上 它可以正常工作 如果我停止服务器 这就是我看到的错误 在浏览器中 Attempt to
  • 当指定acceptNode时,createNodeIterator在IE9中失败

    Target 我想循环遍历 DOM 文本节点 按它们在 DOM 中的顺序排序 此外 我想通过自定义逻辑过滤节点 例如检查节点是否位于特定元素内 此外 所有这些都应该在 IE9 中以尽可能最佳的性能完成 Method 满足上述所有要求之一 d
  • Cypress Angular 什么时候可以开始测试?

    我正在使用 Cypress 对我的 Angular 应用程序进行端到端测试 我观察到的问题之一是 Cypress 的反应速度很快 而我的应用程序准备交互的速度 相对 慢 Cypress 有一些经常被引用的blog https www cyp
  • 如何从 dc js 图表中的 x 轴删除周末日期

    我有 2018 年 1 月以来每个日期的数据 我正在根据这些数据创建一个堆积折线图 每个周末我的数据计数为零 因此每个周末它都会在我的图表中显示下降 当数据达到零时 我想避免这种下滑 我有一个日期列和一个日列 日 列的值从 1 到 7 代表
  • AF网络进展

    我正在尝试使用setDownloadProgressBlockAFHTTPRequestOperation 类 回调给了我 3 个参数 NSInteger bytesRead NSInteger totalBytesRead NSInteg
  • Symfony 4.2 如何公开仅用于测试的服务

    我有公开服务的解决方案 在 services yml 中 test phpdocxService alias App Service PhpDocxService public true 我尝试访问该服务 container self co
  • Windbg !address 输出中的 是什么意思

    Example 0 074 gt address summary Usage Summary RgnCount Total Size ofBusy ofTotal Free 90919 7ec 34659000 7 923 Tb 99 03
  • 为什么在一行中运行两个 PowerShell 命令时输出格式会发生变化?

    执行两个用分号分隔的 PowerShell 命令时 我得到了意外的结果 第二个命令的输出发生变化 如果我以相反的顺序运行它们 我看不到第二个命令输出 在这里 我只是想获取时间戳和用户在 AD 中所属的组列表 作为一句简单的话 如果我运行这一
  • Android IAP 问题,购买对象中没有 OrderID

    我正在使用具有测试许可证访问权限的帐户之一测试 Android 应用内购买订阅 我知道测试访问权限不支持订阅 注意到没有orderId在购买响应 JSON 中 但付款已完成 不过不收费 因为此订阅有 7 天的跟踪 响应 json 如下所示
  • Nexus 工件上传

    如何使用 jenkins shell 将工件上传到 Nexus 并自动生成版本 我正在使用这个脚本 我想在上传工件时自动生成版本 mvn deploy deploy file DgroupId DartifactId Dversion Dg
  • 如何使用 Inno Setup 检查互联网连接

    我正在学习 Inno Setup 来制作一个简单的安装程序 在安装过程中我需要从网站下载文件 因此检查是否有互联网连接很重要 在安装过程中如何检查或采取一些警报以连接互联网 Thanks 最好的检查是尝试实际下载该文件 互联网 几乎不是一个
  • Makefile 排列

    Bash 可以产生排列 笛卡尔积 http wikipedia org wiki Cartesian product echo 1 2 a b 1a 1b 2a 2b 我想用 makefile 做类似的事情 这是一个例子 生成文件 all
  • 无效异常展开导致崩溃?

    我正在调试我们的一项测试中发生的崩溃 我们有一个用 C 编写的 ODBC 驱动程序 so 正在使用我们的测试工具 称为 Touchstone 通过 iODBC 对其进行测试 该工具也是用 C 编写的 我已使用 Oracle Solaris
  • jQuery 的 .data() 缓存是否在 jQuery mobile 中的页面转换中持续存在?

    我刚刚在读 jQuery data API参考 http api jquery com data 之前 我推测它可能通过分配来工作 data 页面元素的属性 有效地捷径 foo attr data foobar bar 1 想象一下 它确实
  • 具有自定义默认值的 EclipseLink JPA 主键

    我的 SQL Server 数据库中有一个表 其中主键字段定义为NEWID 作为默认值 期望客户端不需要传递主键字段值 SQL Server 将处理它 在 JPA 定义模型类时 我必须使用生成类型定义此 ID 字段 我试过IDENTITY
  • 如何通过RPC监听firestore

    我想听firestore中的实时变化 而且我也只允许使用Go 由于 Firestore SDK for Go 没有任何选项来监听实时更改 因此我决定使用 firestore v1beta1 sdk 我编写了以下代码来做到这一点 func T