如何从Collection文档onUpdate获取数据?

时间:2019-10-16 08:55:03

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

我正在尝试从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日志中的错误。

1 个答案:

答案 0 :(得分:1)

您将获得Error: 4 DEADLINE_EXCEEDED。在网上快速进行search显示,这似乎在“您提出的请求花费的时间太长”时发生。

但是,关于您在上面的评论中所做的澄清,似乎您处理的不是大量邮件。

如果您返回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;
        });

    });

事实上,您必须在后台触发的Cloud Function中返回Promise或值。我建议您观看Firebase视频系列中有关“ JavaScript承诺”的3个视频:https://firebase.google.com/docs/functions/video-series/,它们解释了这一要点。