首页 > 解决方案 > Firebase Admin SDK 事件侦听器未触发

问题描述

我正在使用 Go Firebase Admin SDK 并监听实时数据库中的变化。问题是只有当我从 Firebase 控制台手动更新数据时才会触发监听器,如果我从另一个应用程序(在本例中为 Flutter)更改数据,即使在 Firebase 控制台中可以看到更改,也不会触发监听器(所以数据肯定改变了)。

我什至尝试通过 Firebase 数据库 REST API https://firebase.google.com/docs/reference/rest/database#section-streaming执行更新,
结果相同:在控制台中可以查看数据更改,但仍然没有t 触发监听器。

这是我听 Go 变化的方式:

func listenToFirebase(ref *db.Ref, ctx context.Context) {
    iter, err := ref.Listen(ctx)
    if err != nil {
        fmt.Printf(" Error: failed to create Listener %v\n", err)
        return
    }
    defer iter.Stop()

    for {
        if iter.Done() {
            break
        }
        event, err := iter.Next()
        if err != nil {
            // Handle error here based on specific usecase
            // We can continue Listening
            log.Printf("%v\n", err)
            continue
        }
        fmt.Printf("Listener | Ref Path: %s | event.Path %s | event.Snapshot() = %v\n", ref.Path, event.Path, event.Snapshot())
        fmt.Printf("\n")
    }
}

通过从控制台更新数据触发侦听器这一事实表明侦听器工作正常。

PS:Listen-Method 尚未集成到 Go Firebase Admin SDK 中,来自https://github.com/firebase/firebase-admin-go/issues/229

标签: firebasefluttergofirebase-realtime-database

解决方案


结果证明 Go 代码没有问题。问题是我从 Flutter 更新实时数据库的方式。

这是我用来执行更新的:

await ref.update({"value": value});

解决问题的方法是通过以下方式使用“set”而不是“update”:

await ref.child("value").set(value);

这样,我的 Go-Listener 方法最终被触发,一切都按预期工作。


推荐阅读