【问题标题】:Google Cloud Function WHERE query filter does not workGoogle Cloud Function WHERE 查询过滤器不起作用
【发布时间】:2020-07-26 15:21:29
【问题描述】:

我正在努力使用更新集合组“place_users”上的“存在”属性的云功能。

我的查询没有按“存在”== true 过滤条目。它曾经在客户端工作,但我将它切换到云功能,它不再过滤。所有文件都被退回。

exports.updatePoiPresence = functions.https.onCall((data: any, context: any) => {

    return new Promise((resolve, reject) => {

        return store.collectionGroup("place_users",
                (ref: any) => ref
                .where("user_id", "==", context.auth.uid)
                .where("day_stamp", "<", data.start_of_day / 1000)
                .where("presence", "==", true))
            .get()
            .then(
                (q_snapshot: any) => {

                    return q_snapshot.forEach((snapshot: any) => {
                        functions.logger.log("no docs value data fct:", snapshot.data())


                        snapshot.ref.update({
                                presence: false
                            })
                            .then((a: any) => {
                                resolve("ok");
                            })
                            .catch((error: any) => {
                                functions.logger.log("error survenue", error);
                                reject("Rejet pas identifie")
                            })
                    });


                })
    });
});

我为该 collectionGroup 创建了一系列索引: (我不知道在什么情况下使用哪个,因为我一直通过控制台单击索引创建向导,而没有考虑它们的用途。

【问题讨论】:

  • 您在哪里记录我们可以在您的屏幕截图中看到的“no docs value data fct”字符串?
  • 嗨@RenaudTarnec,我刚刚编辑了我的帖子
  • 您似乎试图将代码从 Angular 移植到运行 Cloud Functions 的后端代码中。这是行不通的,因为 SDK 有不同的语法。此外,无需在这里创建新的承诺。所有 API 都已经处理了 Promise - 只需使用 API 提供的那些即可。

标签: javascript node.js firebase google-cloud-firestore google-cloud-functions


【解决方案1】:

您似乎错误地使用以下方式查询数据库:

    return store.collectionGroup("place_users",
        (ref: any) => ref
            .where("user_id", "==", context.auth.uid)
            .where("day_stamp", "<", data.start_of_day / 1000)
            .where("presence", "==", true))
        .get()

collectionGroup() 方法只接受一个参数。你应该这样做:

    return store.collectionGroup("place_users")
            .where("user_id", "==", context.auth.uid)
            .where("day_stamp", "<", data.start_of_day / 1000)
            .where("presence", "==", true))
        .get()

此外,请注意 Firebase 异步方法返回承诺。您无需将代码包装在 return new Promise(); 中。

以下应该可以解决问题。

const store = admin.firestore();

exports.updatePoiPresence = functions.https.onCall((data: any, context: any) => {

    return store.collectionGroup("place_users")
        .where("user_id", "==", context.auth.uid)
        .where("day_stamp", "<", data.start_of_day / 1000)
        .where("presence", "==", true)
        .get()
        .then((q_snapshot: any) => {
            const promises = [];
            q_snapshot.forEach((snapshot: any) => {
                functions.logger.log("no docs value data fct:", snapshot.data())
                promises.push(snapshot.ref.update({ presence: false }));
            });
            return Promise.all(promises);
        })
        .catch((error: any) => {
            functions.logger.log("error survenue", error);
            return null;
        })

});

请注意,我们使用Promise.all(),因为我们对数据库并行执行多个异步操作(使用返回承诺的update() 方法,请参阅doc)。


你也可以看看"Cloud Functions for Firebase: getting started with TypeScript"官方的文章。特别要注意 Cloud Functions 的导出方式,与 JavaScript (exports. -> export const) 进行比较。

【讨论】:

  • 谢谢 一切都好,除了双return语句,第一个return q_snapshot应该去掉,只有return Promise.all应该存在。我不禁想知道带有回调函数作为第二个参数的 collectionGroup 方法来自哪里,因为我实际上在不同的位置看到它:例如这个人使用相同的语法:stackoverflow.com/questions/56313259/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
  • 2021-08-14
  • 2019-10-14
  • 1970-01-01
  • 2015-01-05
  • 2019-04-16
相关资源
最近更新 更多