从集合中获取多个文档超出了Firestore内存限制

时间:2018-12-27 14:59:38

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

我正在尝试获取Firestore集合中的所有文档,其中我的字段referredBy等于变量refCode(引荐代码)。我继续在Stackdriver中收到错误:“错误:超出内存限制。函数调用被中断。”

此功能的说明在这里:https://firebase.google.com/docs/firestore/query-data/get-data#get_multiple_documents_from_a_collection

我尝试将此云功能的内存分配增加到2 GB(最大),但是仍然是相同的错误。此集合中只有两个文档,并且只有一个符合我的“ where”标准,因此文档的大小无论如何都不应该成为问题。

这来自我的index.js:

const express = require('express');
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const app = express();

// Get referred users:
app.get('path/to/myapp', (req, res) => {

    var getReferred = require('./getRefUsers');
    if (admin.apps.length === 0 ) { admin.initializeApp(functions.config().firebase); }
    var db = admin.firestore();
    getReferred.getUsersReferred(req, res, db);
});
exports.getReferred = functions.https.onRequest(app);

调用以下函数:

module.exports = {

getUsersReferred: function(req, res, db) {

    const { shopName, twitchId } = req.query;

    // Get users account to get their referral code:
    var docRef = db.collection('stores').doc(shopName).collection('users').doc(twitchId);
    docRef.get()
        .then((docSnapshot) => {                                                                    
            if (!docSnapshot.exists) {
                var msg = 'User ' + twitchId + ' does not exist.';
                console.log(msg);
                res.json({ 'status': 'error', 'message': msg });
            } else {

                var referredUsers = [];

                // Get all users who were referred by this user
                var refCode = docSnapshot.data().referralCode;
                console.log('refCode: ' + refCode + ' shop: ' + shopName + ' id: ' + twitchId);

                db.collection('stores').doc(shopName).collection('users').where("referredBy", "==", refCode)
                    .get()
                    .then(function(querySnapshot) {
                            console.log('Size: ' + querySnapshot.size);

                            querySnapshot.forEach(function(doc) {
                                // doc.data() is never undefined for query doc snapshots
                                console.log(doc.id, " => ", doc.data());
                                var username = doc.data().username;
                                var earned = doc.data().earnedreferpoints;
                                var id = doc.data().twitchId;
                                if (typeof earned == 'undefined' || earned == 'no') {
                                    earned = 'No';
                                } else {
                                    earned = 'Yes';
                                }

                                if (doc.data().referredBy == refCode) {
                                    referredUsers[id] = [username, earned];
                                }

                            });

                            // After assembling json object, send to user:
                            res.json({ 'status': 'success', 'data': referredUsers} );
                    })
                    .catch(function(error) {
                        var msg = 'Error getting users you have referred. Please contact us.';
                        console.log(msg + ' ', error);
                        res.json({ 'status': 'error', 'message': msg });
                    });
            }

        })
        .catch(function(error) {
            var msg = '';
            console.log(msg);
            res.json({ 'status': 'error', 'message': msg });
    });

}
};

代码永远不会到达.then()块。 console.log('Size: ' + querySnapshot.size);未打印到Stackdriver日志中。

1 个答案:

答案 0 :(得分:0)

已解决。

如果有人知道为什么可行,请告诉我。

因此,在调用Firestore数据库之前,将创建变量var referredUsers = [];。当我的查询找到匹配项时,它会将这样的数据添加到referredUsers:referredUsers[id] = [username, earned];,它将referredUsers视为字典/对象而不是数组。这在我的本地计算机上运行良好,并且将referredUsers打印为:[ <274940135 empty items>, [ 'areliven', 'Yes' ] ],看起来很奇怪,我不太了解。但是以某种方式这导致我在Firebase云功能中运行时超出了内存限制。

我如何解决

就这样将var referredUsers = [];更改为var referredUsers = {};!现在,它在本地打印出{ '274940135': [ 'areliven', 'Yes' ] },并且可以在Firebase云功能上正常运行。

再次,如果有人可以阐明这可能导致我超出Firebase的内存限制,那真是太好了!