Kev*_*ert 5 rpc real-time go firebase google-cloud-firestore
我想收听Firestore中的实时变化,并且只允许使用Go。由于Go的firestore SDK没有任何选项可以监听实时更改,因此我决定使用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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我这样做时,代码不会检测到我在数据库中手动带来的任何更改。stream.Recv()
只是返回EOF并立即退出。我什至尝试通过添加手动等待,time.Sleep()
但这也无济于事。
你不需要 beta SDK 或 hacks 来实现这一点,我找到了解决方案,实际上很容易。
该https://firebase.google.com/docs/firestore/query-data/listen文档不包含了一个范例。
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
返回快照迭代,我们希望,在这之后一切都简单,我们只是让通过它的infivitive循环法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:
// [...]
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
你的, Gerasimos Maropoulos aka @kataras
Ron*_*ton -2
Firebase 的使用 Cloud Firestore 获取实时更新文档目前表明尚不支持 Go。
// Go 客户端库尚不支持
归档时间: |
|
查看次数: |
482 次 |
最近记录: |