【问题标题】:How to fetch data from a Collection document onUpdate?如何从集合文档 onUpdate 中获取数据?
【发布时间】:2019-10-16 08:55:03
【问题描述】:

我正在尝试从 firebase onUpdate 文档“bulkMsgs”中的“用户”集合中查询数据,但每次我这样做时都会收到“获取用户时出错”。

这两种方法都可以单独工作,但是当我将它们结合起来时,就会发生错误。

我在这里错过了什么?!

var functions = require("firebase-functions");
let admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

    exports.bulkMsg = functions.firestore
        .document('/bulkMsgs/{bulkMsgsId}').onUpdate((snap, context) => {

            const newValue = snap.after.data();
            const regDate = newValue.regDate;

            admin.firestore().collection('users').get().then(onUser => {
                onUser.forEach(oneUser => {
                    if (oneUser.data().notification === "true") {
                       console.log(oneUser.id);
                    }
                });
                return true;

            }).catch(err => {
                console.log('Error getting user', err);
            });


            return true;
        });

Image CF 日志中的错误。

【问题讨论】:

  • 那么errconsole.log('Error getting user', err); 中的值是多少?换句话说,您得到的确切错误是什么?无论如何请注意,您需要返回 get() 方法返回的承诺。
  • 我已经更新了原帖并添加了错误信息。
  • 好的,谢谢。在您的代码中,以下是否有任何内容? if (oneUser.data().notification === "true") {
  • 另外,users 集合中有多少文档?
  • 是的,只是打印用户 ID console.log(oneUser.id);

标签: typescript firebase google-cloud-firestore google-cloud-functions


【解决方案1】:

您将收到Error: 4 DEADLINE_EXCEEDED。在网上快速search 表明它似乎发生在“您提出的请求花费太长时间”时。

但是,关于您在上述 cmets 中给出的说明,您似乎并未处理大量问题。

如果你返回get()异步方法返回的promise会发生什么,如下。

exports.bulkMsg = functions.firestore
    .document('/bulkMsgs/{bulkMsgsId}').onUpdate((snap, context) => {

        const newValue = snap.after.data();
        const regDate = newValue.regDate;

        return admin.firestore().collection('users').get()
        .then(onUser => {
            onUser.forEach(oneUser => {
                if (oneUser.data().notification === "true") {
                   console.log(oneUser.id);
                }
            });
            return null;
        }).catch(err => {
            console.log('Error getting user', err);
            return null;
        });

    });

事实上,您必须在后台触发的云函数中返回一个 Promise 或一个值。我建议您观看 Firebase 视频系列中关于“JavaScript Promises”的 3 个视频:https://firebase.google.com/docs/functions/video-series/,其中解释了这个关键点。

【讨论】:

    猜你喜欢
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 2020-08-15
    • 2023-03-03
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    相关资源
    最近更新 更多