Как слушать firestore через rpc? - PullRequest
0 голосов
/ 06 июля 2018

Я хочу слушать изменения в реальном времени в пожарном депо, и мне также разрешено использовать только Голанг. Поскольку Firestore SDK для golang не имеет возможности прослушивать изменения в реальном времени, я решил использовать 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(), но это тоже не помогает.

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Вам не нужен бета-SDK или хаки, чтобы это произошло, я нашел решение, на самом деле это довольно просто. Читайте ниже ...

Документация https://firebase.google.com/docs/firestore/query-data/listen не содержит пример для Go.

Исходный код клиентского API Firestore для Go содержит необъявленный 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:
                // [...]
            }
        }
    }
}

С уважением, Герасим Маропулос ака @ kataras

0 голосов
/ 06 июля 2018

Firebase's Получение обновлений в реальном времени с Cloud Firestore Документация в настоящее время указывает, что Go еще не поддерживается.

// Пока не поддерживается в клиентской библиотеке Go

...