Firebase -Geofire 和云功能。功能结束是否意味着不再有听众?

Firebase - Geofire and Cloud Functions. Does end of function means no more listeners?

在我的云函数的 index.js 文件中,我有以下函数体:

exports.onSuggestionCreated = functions.firestore.document('suggestions/{userId}').onCreate(event => {

    return admin.firestore().doc(`places/settings/profile`).get().then(doc => {

        [...]

        const location = data.location

        const ref = admin.database().ref(`suggestion_locations`)
        const geoFire = new GeoFire(ref)

        var geoQuery = geoFire.query({
            center: [location.latitude, location.longitude],
            radius: 1.0
        })

        geoQuery.on("key_entered", function(key, location, distance) {
           return sendMessageTo(key, title, body)
        })
    })
})

这是一个函数,每当创建东西时都会触发该函数。

我想知道的是,即使云功能早已终止,每当有东西进入由 GeoFire 的位置和半径分隔的区域时,是否会调用 "key_entered"?我收到一些奇怪的日志表明如此。

考虑到 GeoFire 的异步性质,在这种情况下我能做什么?

GeoFire 依赖于范围内的 keeping active listeners on the geodata。这与 Cloud Functions 的 run-and-exit 范式不匹配。

概念(在 geohashes 中存储经纬度和 运行 范围查询)工作正常,但您可能需要修改库或注意其实现细节以使其在您的情况下工作.

最好的似乎是return,例如当前在给定区域内的所有位置。这可以通过监听 key_entered 事件(就像你已经做的那样) ready 事件来完成,其中 fires after the initial key_entered calls have been received.

exports.onSuggestionCreated = functions.firestore.document('suggestions/{userId}').onCreate(event => {

  return admin.firestore().doc(`places/settings/profile`).get().then(doc => {
    [...]

    const location = data.location

    return new Promise(function(resolve, reject) {
        const ref = admin.database().ref(`suggestion_locations`)
        const geoFire = new GeoFire(ref)

        var geoQuery = geoFire.query({
            center: [location.latitude, location.longitude],
            radius: 1.0
        })

        geoQuery.on("key_entered", function(key, location, distance) {
           sendMessageTo(key, title, body)
        })
        geoQuery.on("ready", function() {
            resolve();
        });
    });
  })
})