• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

firebase - 如何通过RPC收听firestore

[复制链接]
菜鸟教程小白 发表于 2022-8-16 06:38:58 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我想收听 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() 手动等待但这也无济于事。



Best Answer-推荐答案


你不需要 beta SDK 或 hacks 来实现这一点,我找到了解决方案,实际上很容易。

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

对存储库的深度搜索表明,这实际上用于 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/query.go#L716 .
Collection包含 Snapshots方法返回我们想要的快照迭代器,之后一切都很简单,我们只需通过它的 Next 进行一个不活跃的循环。方法。

例子:

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:
                // [...]
            }
        }
    }
}

您的, Gerasimos Maropoulos 又名 @kataras

关于firebase - 如何通过RPC收听firestore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51200460/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap